2023年7月28日

WPF PopopHelper

 



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls.Primitives;


    public class PopopHelper

    {

        public static DependencyObject GetPopupPlacementTarget(DependencyObject obj)

        {

            return (DependencyObject)obj.GetValue(PopupPlacementTargetProperty);

        }


        public static void SetPopupPlacementTarget(DependencyObject obj, DependencyObject value)

        {

            obj.SetValue(PopupPlacementTargetProperty, value);

        }


        public static readonly DependencyProperty PopupPlacementTargetProperty =

            DependencyProperty.RegisterAttached("PopupPlacementTarget", typeof(DependencyObject), typeof(PopopHelper), new PropertyMetadata(null, OnPopupPlacementTargetChanged));


        private static void OnPopupPlacementTargetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

        {

            if (e.NewValue != null)

            {

                DependencyObject popupPopupPlacementTarget = e.NewValue as DependencyObject;

                Popup pop = d as Popup;


                Window w = Window.GetWindow(popupPopupPlacementTarget);

                if (null != w)

                {


                    w.LocationChanged += delegate

                    {

                        var mi = typeof(Popup).GetMethod("UpdatePosition", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

                        mi.Invoke(pop, null);

                    };


                    w.SizeChanged += delegate

                    {

                        var mi = typeof(Popup).GetMethod("UpdatePosition", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

                        mi.Invoke(pop, null);

                    };

                }

            }

        }

    }


沒有留言:

張貼留言