2009-08-12 27 views
2

私はWPFポップアップを使用していますが、アプリケーションが最小化されている場合でも、デスクトップ上のすべての単一ウィンドウの上にポップアップ表示されます。どのように私はそれが起源のウィンドウにだけ滞在することができますか?私のウィンドウが他のウィンドウの後ろにあるときにも同じことが起こります。ポップアップがそれらの上に表示されます。WPFポップアップZOrder

「何かできる必要があります!」

ありがとうございました。

+0

私は同じ問題があり、それを解決できませんでした。これはデフォルトの動作だとは考えにくいですが、MSDNはこれ以上役に立たないものです。私が解決した方法は、コンボボックスを含むウィンドウ全体をウィンドウxamlのTopMost = Trueとして設定することです。これは、ウィンドウ全体を、ComboBoxのドロップダウンだけでなく、ポップアップの場合と同じように、最も上にします。 – pixel

答えて

3

私もこの問題を解決しようとしましたが、良い解決策は見つかりませんでした。これは、それが動作するはずの方法であるように思われ、あなたはそれを上書きすることはできません。

私が思いついた唯一の解決策は、通常のレイアウトパネルを使用してZ-インデックスを上げることです。トップレベルのコントロールです(この種のポップアップをシミュレートします)。これがうまくいかないことがわかったのは、WindowsFormsHostsを使って画面にWinFormsがあるときだけです。これらのWinformsは常にWPFのものより高いZ-インデックスにあります。つまり、ポップアップを使用して回避する必要があるときです。この

0

私はそれをやろうとはしませんでしたが、これは飾り手を使って行うこともできると読んでいます... Matt GalbraithはMSDNフォーラムで同じ質問をしました。このスレッドを読む。

7

私はフレームワークのソースコードを調べて、実際にウィンドウがどこに最上位になるのかを調べて、それをプライベートネストされたクラスで行います。しかし、メインウィンドウの子ポップアップか、一番上のウィンドウにするかの選択肢はありません。これは、常に子のポップアップウィンドウにするためのハックです。依存関係プロパティを簡単に追加して、それを一番上にするためにいくつかの魔法を加えることができます。

using System; 
using System.Reflection; 
using System.Windows; 
using System.Windows.Controls.Primitives; 

namespace UI.Extensions.Wpf.Controls 
{ 
    public class ChildPopup : Popup 
    { 
     static ChildPopup() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(ChildPopup), new FrameworkPropertyMetadata(typeof(ChildPopup))); 
     } 

     public ChildPopup() 
     { 
      Type baseType = this.GetType().BaseType; 
      dynamic popupSecHelper = GetHiddenField(this, baseType, "_secHelper"); 
      SetHiddenField(popupSecHelper, "_isChildPopupInitialized", true); 
      SetHiddenField(popupSecHelper, "_isChildPopup", true); 
     } 

     protected dynamic GetHiddenField(object container, string fieldName) 
     { 
      return GetHiddenField(container, container.GetType(), fieldName); 
     } 

     protected dynamic GetHiddenField(object container, Type containerType, string fieldName) 
     { 
      dynamic retVal = null; 
      FieldInfo fieldInfo = containerType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance); 
      if (fieldInfo != null) 
      { 
       retVal = fieldInfo.GetValue(container); 
      } 
      return retVal; 
     } 

     protected void SetHiddenField(object container, string fieldName, object value) 
     { 
      SetHiddenField(container, container.GetType(), fieldName, value); 
     } 

     protected void SetHiddenField(object container, Type containerType, string fieldName, object value) 
     { 
      FieldInfo fieldInfo = containerType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance); 
      if (fieldInfo != null) 
      { 
       fieldInfo.SetValue(container, value); 
      } 
     } 
    } 
} 
+1

ChildPopupから継承する必要があるのが好きであれば、コードはそのまま動作しません。私はpopupSecHelper行をこれに変更しました: オブジェクトpopupSecHelper = GetHiddenField(this、typeof(Popup)、 "_secHelper"); また、私はDefaultStyleKeyPropertyのオーバーライドをスキップしました。なぜなら、これは必要ではないように見えます。なぜそれが必要なのかわかりません。 – TGasdf

関連する問題