2009-08-12 7 views
2

Ich benutze ein WPF-Popup, aber es erscheint Popups über jedem einzelnen Fenster auf meinem Desktop, auch wenn meine Anwendung minimiert ist. Wie kann ich es nur auf dem Fenster bleiben lassen, von dem es stammt? Das Gleiche passiert, wenn sich mein Fenster hinter anderen Fenstern befindet: Das Popup wird über allen angezeigt.WPF Popup ZOrder

"Es muss etwas getan werden!"

Danke.

+0

Ich habe dasselbe Problem und konnte es nicht lösen. Es ist schwer zu glauben, dass dies ein Standardverhalten ist, aber MSDN ist hier mehr als nutzlos. Die Art, wie ich es gelöst habe, ist, dass ich das ganze Fenster, das ComboBox enthält, als TopMost = True im Fenster xaml einstelle. Das macht das ganze Fenster am besten, nicht nur das Dropdown meiner ComboBox (das gleiche wie in Ihrem Popup-Fall). – pixel

Antwort

3

Ich habe versucht, dieses Problem zu lösen, und habe keine gute Lösung gefunden. Dies scheint so zu sein, wie es funktionieren soll, und Sie können das nicht überschreiben.

Die einzige Lösung, die ich gefunden habe, ist nur ein normales Layout-Panel zu verwenden und den Z-Index zu erhöhen, also ist es das oberste Steuerelement (simuliert das Popup). Die einzige Zeit, die ich festgestellt habe, dass dies nicht funktioniert, ist, wenn Sie WinForms über WindowsFormsHosts auf dem Bildschirm haben. Diese Winforms haben immer einen höheren Z-Index als die WPF-Dateien. Das ist, wenn Sie ein Popup verwenden müssen, um es zu umgehen.

0

Obwohl ich nicht versucht habe, es zu tun, habe ich auch gelesen, dass dies mit Adornern getan werden kann ... Matt Galbraith schlug es im MSDN Forum vor, wenn die gleiche Frage gestellt ... falls jemand noch ist diesen Thread lesen.

7

Also habe ich durch den Framework-Quellcode geforscht, um zu sehen, wo es tatsächlich das Fenster verursacht, das oberste zu sein, und es tut dies in einer privaten verschachtelten Klasse. Es bietet jedoch keine Option, entweder nur ein untergeordnetes Popup des Hauptfensters zu sein oder das oberste Fenster zu sein. Hier ist ein Hack, um es immer ein Kind Popup-Fenster zu machen. Man könnte leicht eine Abhängigkeitseigenschaft hinzufügen und etwas mehr Magie machen, um es am besten zu machen.

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

Wenn Sie möchten, dass ich von ChildPopup erben muss, funktioniert der Code nicht so wie er ist. Ich änderte die popupSecHelper Zeile zu diesem: object popupSecHelper = GetHiddenField (dies, typeof (Popup), "_secHelper"); Auch übersprang ich die DefaultStyleKeyProperty überschreiben, wie es nicht benötigt wird, und ich kann nicht sehen, warum es sollte. – TGasdf