5

私は WPF ポップアップを使用していますが、アプリケーションが最小化されている場合でも、デスクトップ上のすべてのウィンドウの上にポップアップします。元のウィンドウだけにとどまらせるにはどうすればよいですか? 私のウィンドウが他のウィンドウの背後にある場合も同じことが起こります。ポップアップはそれらすべての上に表示されます。

「何かできることがあるに違いない!」

ありがとう。

4

5 に答える 5

8

そこで、フレームワークのソース コードを掘り下げて、ウィンドウが実際に最上位になる場所を確認し、ネストされたプライベート クラスでこれを行います。ただし、メイン ウィンドウの子ポップアップにするか、一番上のウィンドウにするかのオプションは提供されません。これは、常に子ポップアップウィンドウにするためのハックです。依存関係プロパティを簡単に追加し、さらに魔法をかけて最上位にすることができます。

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);
            }
        }
    }
}
于 2011-09-20T20:07:09.127 に答える
3

私もこの問題を解決しようとしましたが、良い解決策が見つかりませんでした。これは動作するはずの方法のようであり、それをオーバーライドすることはできません。

私が思いついた唯一の解決策は、通常のレイアウト パネルを使用して Z-Index を上げることです。これにより、それがトップレベル コントロールになります (この種のポップアップをシミュレートします)。これが機能しないことがわかったのは、WindowsFormsHosts を介して画面に WinForms がある場合だけです。これらの Winform は常に、どの WPF よりも高い Z-Index にあります。その場合は、Popup を使用して回避する必要があります。

于 2009-08-13T02:38:14.817 に答える
2

これを確認してください:http://chriscavanagh.wordpress.com/2008/08/13/non-topmost-wpf-popup/

これはあなたを助けることができるかもしれません!!

于 2009-11-05T18:29:21.690 に答える
0

私はそれを試みたことはありませんが、これは adorners を使用して実行できることも読みました...Matt Galbraith は、同じ質問をされたときに MSDN フォーラムでそれを提案しました...誰かがまだこのスレッドを読んでいる場合に備えて。

于 2010-12-07T21:32:27.367 に答える