2009-08-12 56 views
2

我使用的是WPF彈出,但它在我的桌面上的每一個窗口上方彈出式菜單了,即使我的應用程序最小化。我怎樣才能讓它只停留在它起源的窗口上?當我的窗口位於其他窗口後面時,會發生同樣的事情:彈出窗口顯示在其上方。WPF彈出ZORDER

「一定有什麼事情可以做!」

謝謝。

+0

我有同樣的問題,無法解決它。很難相信這是默認行爲,但MSDN在此上無用。我解決它的方式是在窗口xaml中將包含comboBox的整個窗口設置爲TopMost = True。這使得整個窗口最重要的不僅僅是我的ComboBox的下拉列表(與彈出窗口中的相同)。 – pixel 2016-05-05 22:10:27

回答

3

我試圖來解決這個問題爲好,並沒有發現任何好的解決方案。這似乎是它應該工作的方式,而且你不能覆蓋它。

唯一的解決方案,我想出來的是隻使用常規佈局面板,並提高它的Z-指數,所以它是最高級別控制(這種模擬彈出)。唯一一次我發現這不起作用的是當你通過WindowsFormsHosts在屏幕上顯示WinForms時。那些Winforms總是比任何WPF的東西都更高的Z-Index。那是你必須使用Popup來解決它的時候。

0

雖然我還沒有嘗試這樣做,我也看到了,這可以用裝飾器來完成...馬特·加爾佈雷思認爲它在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行更改爲: object popupSecHelper = GetHiddenField(this,typeof(Popup),「_secHelper」); 此外,我跳過DefaultStyleKeyProperty覆蓋,因爲它似乎並不需要,我不明白爲什麼它應該。 – TGasdf 2015-03-20 16:41:18