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);
}
}
}
}
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