当前位置:  开发笔记 > 编程语言 > 正文

拖动WPF弹出控件

如何解决《拖动WPF弹出控件》经验,为你挑选了2个好方法。

WPF Popup控件很不错,但在我看来有些局限.有没有办法在打开时"拖动"弹出窗口(就像使用Windows的DragMove()方法一样)?

这可以在没有大问题的情况下完成,还是我必须自己编写弹出类的替代品?谢谢



1> Jobi Joy..:

PopUp没有DragMove.只是一个小小的工作,你可以添加很多改进.


               

在后面的代码中,添加此mousemove事件

   pop.MouseMove += new MouseEventHandler(pop_MouseMove);

   void pop_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            pop.PlacementRectangle = new Rect(new Point(e.GetPosition(this).X,
                e.GetPosition(this).Y),new Point(200,200));

        }
    }


**哎哟**!不,使用[`Thumb`](http://msdn.microsoft.com/en-us/library/ms749252%28VS.100%29.aspx)及其`DragDelta`事件(选择.`DraginStarted` /如果你想管理状态,可以使用`DragCompleted`.它效率更高,不会破坏内存,也不会像上面的例子那样丢失鼠标.这就是正确完成拖动的方法:)参见[这里](http://www.codeproject.com/KB/WPF/TubePlanner.aspx)的例子.

2> jacob..:

这是使用Thumb的简单解决方案.

XAML中的子类Popup和代码隐藏

添加一个宽度/高度设置为0的拇指(这也可以在XAML中完成)

在Popup上侦听MouseDown事件,并在Thumb上引发相同的事件

在DragDelta上移动弹出窗口

XAML:


    

    

C#:

public partial class DraggablePopup : Popup 
{
    public DraggablePopup()
    {
        var thumb = new Thumb
        {
            Width = 0,
            Height = 0,
        };
        ContentCanvas.Children.Add(thumb);

        MouseDown += (sender, e) =>
        {
            thumb.RaiseEvent(e);
        };

        thumb.DragDelta += (sender, e) =>
        {
            HorizontalOffset += e.HorizontalChange;
            VerticalOffset += e.VerticalChange;
        };
    }
}


也许我错过了一个经验丰富的WPF开发人员会知道的简单的东西,但这又如何重复使用?当我在不同的XAML上下文中植入控件时(比如尝试在窗口中重用它),我指定的任何内容都会覆盖拇指绑定到的Canvas元素.
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有