Question

J'utilise un WPF Popup, mais il popups au-dessus de chaque fenêtre unique sur mon bureau, même si ma demande est réduite au minimum. Comment puis-je faire rester uniquement sur la fenêtre il est originaire? La même chose se produit lorsque ma fenêtre est derrière d'autres fenêtres. Les écrans pop-up ci-dessus tous

"Il doit y avoir quelque chose à faire!"

Merci.

Était-ce utile?

La solution

J'ai essayé de résoudre ce problème aussi bien, et nous avons trouvé aucune bonne solution. Cela semble être la façon dont il est censé fonctionner, et vous ne pouvez pas ignorer cela.

La seule solution que je suis venu avec est de simplement utiliser un panneau de mise en page régulière et augmenter son Z-Index, il est donc le contrôle de haut niveau (ce genre de simulation Popup). La seule fois que je l'ai trouvé que cela ne fonctionnera pas est quand vous avez WinForms sur l'écran par WindowsFormsHosts. Ces Winforms sont toujours à un plus haut indice Z que tous les trucs WPF. C'est quand vous devez utiliser un Popup pour la contourner.

Autres conseils

Je perçai le code source de cadre pour voir où il provoque effectivement la fenêtre pour être supérieure et il le fait dans une classe imbriquée privée. Toutefois, il ne fournit pas une option pour être soit juste un pop-up de l'enfant de la fenêtre principale ou la fenêtre supérieure. Voici un hack pour le rendre toujours une fenêtre pop-up de l'enfant. On pourrait facilement ajouter une propriété de dépendance et faire un peu plus magique pour en faire le plus haut.

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

Bien que je ne l'ai pas essayé de le faire, je l'ai aussi lu que cela peut être fait en utilisant adorners ... Matt Galbraith a suggéré sur le forum MSDN quand on lui demande la même question ... au cas où quelqu'un est en train de lire encore ce fil.

Voilà comment je l'ai résolu:

    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;
        };
     }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top