gpt4 book ai didi

c# - WPF 弹出 ZOrder

转载 作者:行者123 更新时间:2023-11-30 19:14:13 24 4
gpt4 key购买 nike

我正在使用 WPF 弹出窗口,但它会在我桌面上的每个窗口上方弹出,即使我的应用程序已最小化也是如此。我怎样才能让它只停留在它起源的窗口上?当我的窗口在其他窗口后面时,也会发生同样的事情:弹出窗口显示在所有窗口之上。

“一定有办法的!”

谢谢。

最佳答案

因此,我深入研究了框架源代码,以查看它实际上是在什么位置导致窗口位于最顶层,并且它是在私有(private)嵌套类中执行此操作的。但是,它不提供仅作为主窗口的子弹出窗口或作为最顶层窗口的选项。这是一个使它始终成为子弹出窗口的技巧。可以很容易地添加一个依赖属性并做一些更神奇的事情让它成为最顶层的。

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

关于c# - WPF 弹出 ZOrder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1267349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com