6

WPFポップアップでWindowsフォームコントロールをホストしています。以下の問題:

  1. StaysOpen = Falseにすると、WinFormコントロールを操作できなくなります。ポップアップ領域の外側をクリックすると閉じる必要があるため、StaysOpenをfalseに設定する必要があります。
  2. StaysOpen = Trueにすると、winformコントロールを操作できますが、ポップアップ領域の外側をクリックしても閉じられません。
  3. ポップアップのMouseEnterでStaysOpen=trueを設定し、MouseLeaveでStaysOpen = Falseを設定しようとしましたが、マウスがWinFormコントロールを超えると、MouseLeaveが起動し、予期しない動作が発生します。
  4. ポップアップのIsMouseCaptureWithinプロパティを試しても、winformsでは機能しないことがわかりました(フレームワークのバグだと思います)。

  5. 別の問題は、ルートメインフォーム(Windowsフォーム)が非アクティブ化されている(Alt + Tabを押す)ときにポップアップを閉じようとしましたが、ポップアップでwindowshostControlのコントロールの1つに入っても、このイベント(非アクティブ化)が発生します。

望ましい行動:

  1. wpfポップアップでwinformコントロールをホストして操作できる必要があります。
  2. ポップアップの領域の外側をクリックすると、ポップアップが閉じます。

入力に感謝します。

ありがとう。

4

2 に答える 2

2

WPF の事実上の標準ポップアップは、実際には独自のハンドルを持つ新しいウィンドウであるため、多くの問題がありました。これは、アプリケーションを画面上でドラッグしても、ポップアップはそのままである (ウィンドウと一緒に移動しない) ことを意味します。また、ポップアップに奇妙な動作があり、他のコントロールが通常行う方法でアプリケーションと対話しないことも意味します。

この問題に対処するために、2 つのデコレータ クラスを作成しました。

PopupDecorator.csおよび TimeoutPopupDecorator.cs

使い方はとても簡単です:

  1. 新しいポップアップ クラスの名前空間宣言を追加します。すなわち

    xmlns:dday_wpf="clr-namespace:DDay.WPF"

  2. ポップアップを表示できるようにする領域をデコレータで囲みます。すなわち

    <dday_wpf:PopupDecorator x:Name="popup"> <dday_wpf:PopupDecorator.Popup> ... ポップアップの内容はここに ... </dday_wpf:PopupDecorator.Popup> ... パネルの内容はここに ... < /dday_wpf:ポップアップデコレータ>

Popupその瞬間から 、通常とほぼ同じように機能します。

これですべての問題が解決するわけではありませんが、お役に立てば幸いです。

于 2009-12-09T17:44:47.877 に答える
0

これは、WPF フォームからモードレスの winform コントロールを起動する際の問題に少し似ています。

私の質問をチェックしてくださいなぜ私のWPFテキストボックスは「ちょっと」読み取り専用ですか? .

Doug がポップアップが独自のハンドルを持つウィンドウであると述べたことに基づいて、正当な存在がこれを適用可能にします。

于 2009-12-14T13:37:52.743 に答える