簡體   English   中英

WPF Popup ZOrder

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM