解决popup不随着window一起移动的问题

当我们设置Popup的StayOpen="True"时,会发现移动窗体或者改变窗体的Size的时候,Popup并不会跟随着一起移动位置。为了解决这个问题,可以给Popup定义一个附加属性,代码如下所示:

/// <summary>
/// Popup帮助类,解决Popup设置StayOpen="True"时,移动窗体或者改变窗体大小时,Popup不随窗体移动的问题
/// </summary>
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)
            {
                //让Popup随着窗体的移动而移动
                w.LocationChanged += delegate
                {
                    var mi = typeof(Popup).GetMethod("UpdatePosition", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                    mi.Invoke(pop, null);
                };
                //让Popup随着窗体的Size改变而移动位置
                w.SizeChanged += delegate
                {
                    var mi = typeof(Popup).GetMethod("UpdatePosition", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                    mi.Invoke(pop, null);
                };
            }
        }
    }
}

使用方法:

<Popup x:Name="PART_Popup" AllowsTransparency="True" IsOpen="True" Placement="Bottom"
       PlacementTarget="{Binding ElementName=PART_ToggleButton}"
       HorizontalOffset="-5"
       ZUI:PopopHelper.PopupPlacementTarget="{Binding ElementName=PART_ToggleButton}"
       StaysOpen="True">
    <Border x:Name="ItemsPresenter" Background="Transparent">
        <ItemsPresenter />
    </Border>
</Popup>

参考博客地址:

1、http://www.cnblogs.com/Leaco/p/3168540.html

2、http://www.cnblogs.com/xiaokang088/archive/2011/07/06/2099489.html

时间: 2024-08-03 07:55:08

解决popup不随着window一起移动的问题的相关文章

解决 Popup 位置不随窗口移动更新的问题

Popup弹出后,因业务需求设置了StaysOpen=true后,移动窗口位置或者改变窗口大小,Popup的位置不会更新. 如何更新位置? 获取当前Popup的Target绑定UserControl所在窗口,位置刷新时,时时更新Popup的位置即可. 1.添加一个附加属性 1 /// <summary> 2 /// Popup位置更新 3 /// </summary> 4 public static readonly DependencyProperty PopupPlacemen

android在学习——activity关闭和dialog.dismiss冲突的解决(Activity has leaked window com.android.internal.policy.impl.PhoneWindow)

当我们在退出整个程序的时候偶尔会出现这种报错:Activity has leaked window com.android.internal.policy.impl.PhoneWindow 其意思大概就是:窗体已经关闭了但是dialog仍然在显示,Activity has leaked window(activity渗透出窗体),大概就是这个意思. 那么就要在activity finish()之前将dialog dismiss()掉. 我的做法就是重写本activity的onDestroy()方

解决Firefox不响应window.resize事件

Zabbix_server执行window脚本出现中文乱码如何解决

场景分析: A企业员工啊旺在zabbix_server上,执行了一个通过agent调用远程window主机脚本的操作,但是由于该脚本的输出结果带有中文,啊旺在zabbix_server的界面看到的内容是一串乱码字符,他根本不知道远程脚本是否执行成功.于是他想把脚本的输出结果改成英文提示success或者error.但由于该脚本不是由啊旺编写的.所以他不知道应该修改脚本的那个位置,才能使显示为英文.因此,本文的目的就是为了解决,zabbix_server调用window的远程脚本带有中文的显示乱码

WEB前端解决浏览器兼容性问题

1.HTML对象获取问题 FireFox:document.getElementById("idName"); ie:document.idname或者document.getElementById("idName"). 解决办法:统一使用document.getElementById("idName"); 2.const问题 说明:Firefox下,可以使用const关键字或var关键字来定义常量; IE下,只能使用var关键字来定义常量. 解

Window Tidy:最好的 MacOS 分屏工具

本文标签: MacOS分屏工具 WindowTidy Mac小工具 早在 Windows 7 的时代,微软就给其引入了分屏的功能.将窗口拖至显示屏的左右和上边缘,就可以将窗口变为显示器大小的一半或者全屏.而在之后的 Windows 8 和 Windows 10 中,这个功能被发扬光大,甚至可以做到一屏四窗.也因为 Windows 在窗口排列的开创性创新,我们给 Windows 的分屏功能给予了高度的评价. 但是反观 macOS ,直到 2015 年发布的 OS X El Capitan 才引入了

flex调用JS报安全沙箱错误解决办法

flex调用JS方法弹窗时一般会报安全沙箱错误,只要将被调用的JS方法设置延时就可解决. function openKqQuery(){ window.showModalDialog("pages/ck/ckProjectQuery.jsp","", "dialogWidth=860px;dialogHeight=435px;dialogLeft=150px;dialogTop=220px;center=yes;help=no;resizable=no;s

移动端网页开发的一些解决方法【转】

网上看到一片好文,转载保留 高性能 CSS3 动画 尽可能的让动画元素不在文档流中,以减少重排 position: fixed; position: absolute; 尽可能多的利用硬件能力,如使用3D变形来开启GPU加速 -webkit-transform: translate3d(0, 0, 0); -moz-transform: translate3d(0, 0, 0); -ms-transform: translate3d(0, 0, 0); transform: translate3

解决MyEclipse开启后总是不停的在Update index

最近MyEclipse开启之后总是不停的在 update index,很是耗时间, 查找资料发现Update index...是Maven在不断更新, 解决办法如下: Window --> Preferences --> Myeclipse --> Maven4Myeclipse --> 去除Download repository index updates on startup前的勾选即可 版权声明:本文为博主原创文章,未经博主允许不得转载.