0

内部でWinforms pdfviewerを使用してpdfファイルを表示しています。また、ドキュメントの詳細を入力するためのテキストボックスがいくつかあります。最後に、このユーザー コントロールを表示するポップアップ。問題は、テキスト ボックスに何かを入力しようとすると、ntn が発生することです。テキスト ボックスを右クリックすると、切り取り、コピー、貼り付けのオプションを含むコンテキスト メニューが表示されます。少しグーグルで調べたところ、以下のようなものが見つかりましたForms.Integration.WindowsFormsHost.EnableWindowsFormsInterop()。この行をロードされたイベントに配置しましたが、これは機能していません。誰もが同様の問題に直面し、解決策を持つことができますか? ありがとう。レイ

4

1 に答える 1

1

しばらく前にこの問題に遭遇しました。私が思い出したように、それは最上位の WPF メッセージ ループに関係するバグで、WinForms メッセージ ループとうまく機能しませんでした。

私が使用した解決策は、最も外側のレイヤーを WPF ウィンドウから WinForms フォームに変更することでした。というか、交換しました

new Window { Content = CreateContent(), Title = title }.Show();

new ElementHostForm(CreateContent(), title).Show();

このようなクラスを使用して:

class ElementHostForm : System.Windows.Forms.Form
{
  ElementHost _host;

  public WinFormsWindow(UIElement content, string title)
  {
    _host = new ElementHost { Child = content };
    Controls.Add(host);

    content.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
    if(content.DesiredSize.Width > 100 && content.DesiredSize.Height > 100)
      ClientSize = _host.Size =
        new Size((int)content.DesiredSize.Width, (int)content.DesiredSize.Height));

    content.ClearValue(FrameworkElement.WidthProperty);
    content.ClearValue(FrameworkElement.HeightProperty);

    Title = title;
  }

  protected override void OnResize(EventArgs e)
  {
    if(!ClientSize.IsEmpty) _host.Size = ClientSize;
    base.OnResize(e);
  }
}

これにより、WinForms が最も外側のメッセージ ループを持つことができるようになり、バグが回避されました。

トップレベルのコンテンツを別の UserControl (ウィンドウではなく) に既に持っていたので、この変更は非常に簡単でした。トップレベルのコンテンツが Window の場合、リファクタリングが必要になることがあります。

于 2010-01-12T00:06:24.987 に答える