[英]Click on WPF Element with lower ZOrder and without using IsHitTestVisible
[英]WPF Popup ZOrder
我正在使用WPF Popup,但它會彈出我桌面上的每個窗口,即使我的應用程序被最小化。 我怎樣才能讓它只停留在它起源的窗口上? 當我的窗口在其他窗口后面時,同樣的事情發生了:彈出窗口顯示在它們之上。
“必須有一些事情可以做!”
謝謝。
所以我挖掘了框架源代碼,看看它實際上導致窗口最頂端的位置,並在私有嵌套類中執行此操作。 但是,它不提供僅作為主窗口的子彈出窗口或作為最頂層窗口的選項。 這是一個讓它永遠成為子彈出窗口的黑客。 人們可以輕松地添加一個依賴屬性,並做一些魔術,使其成為最重要的。
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);
}
}
}
}
我也試圖解決這個問題,並沒有找到好的解決方案。 這似乎是它應該工作的方式,你不能覆蓋它。
我提出的唯一解決方案是使用常規布局面板並提升它的Z-Index,因此它是頂級控件(這種模擬Popup)。 我發現這不起作用的唯一一次是你通過WindowsFormsHosts在屏幕上有WinForms。 那些Winforms總是處於比任何WPF更高的Z-Index。 那是你必須使用Popup繞過它。
檢查一下: http : //chriscavanagh.wordpress.com/2008/08/13/non-topmost-wpf-popup/
可能這可以幫到你!!
雖然我沒有嘗試過這樣做,但我也讀到這可以通過裝飾來完成......當被問到同樣的問題時,Matt Galbraith在MSDN論壇上提出了這個問題......以防有人還在閱讀這個帖子。
這就是我解決它的方式:
private void Popup_Opened(object sender, EventArgs events)
{
Popup popup = (Popup)sender;
// Get window to make popop follow it when user change window's location.
Window w = Window.GetWindow(popup);
// Popups are always on top, so when another window gets focus, we
// need to close all popups.
w.Deactivated += delegate (object s, EventArgs e)
{
popup.IsOpen = false;
};
// When our dialog gets focus again, we show it back.
w.Activated += delegate (object s, EventArgs e)
{
popup.IsOpen = true;
};
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.