首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >拖动WPF弹出式控件

拖动WPF弹出式控件
EN

Stack Overflow用户
提问于 2008-10-21 14:13:24
回答 5查看 33.3K关注 0票数 21

WPF弹出窗口控件很好,但在我看来有一定的局限性。有没有办法在弹出窗口打开时“拖动”它(就像使用窗口的DragMove()方法一样)?

这样做可以没有大问题吗?或者我必须自己编写一个替代popup类的类?谢谢

EN

回答 5

Stack Overflow用户

发布于 2008-10-21 15:07:33

没有用于PopUp的DragMove。这只是一个小工作,有很多改进,你可以添加到这一点。

代码语言:javascript
复制
<Popup x:Name="pop" IsOpen="True" Height="200" Placement="AbsolutePoint"  Width="200">
   <Rectangle Stretch="Fill" Fill="Red"/>            
</Popup>

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

代码语言:javascript
复制
   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));

        }
    }
票数 19
EN

Stack Overflow用户

发布于 2011-11-02 14:39:26

实现这一点的另一种方法是将弹出窗口的位置设置为MousePoint。这使得弹出窗口最初出现在鼠标光标所在的位置。

然后,您可以使用Thumb或MouseMove事件来设置弹出窗口的HorizontalOffset & VerticalOffset。当用户拖动弹出式窗口时,这些属性会将弹出式窗口从其原始位置移开。

记住要将HorizontalOffset和VerticalOffset重置为零,以便下次使用弹出窗口!

票数 2
EN

Stack Overflow用户

发布于 2019-02-14 03:16:01

基于Jobi Joy的回答,我发现了一个可重用的解决方案,它允许你在现有控件/页面的xaml中作为控件添加,但由于它具有不同的作用域,因此无法添加为具有名称的Xaml。

代码语言:javascript
复制
    [ContentProperty("Child")]
    [DefaultEvent("Opened")]
    [DefaultProperty("Child")]
    [Localizability(LocalizationCategory.None)]
    public class DraggablePopup : Popup
    {
        public DraggablePopup()
        {
            MouseDown += (sender, e) =>
            {
                Thumb.RaiseEvent(e);
            };

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

        /// <summary>
        /// The original child added via Xaml
        /// </summary>
        public UIElement TrueChild { get; private set; }

        public Thumb Thumb { get; private set; } = new Thumb
        {
            Width = 0,
            Height = 0,
        };

        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);

            TrueChild = Child;

            var surrogateChild = new StackPanel();

            RemoveLogicalChild(TrueChild);

            surrogateChild.Children.Add(Thumb);
            surrogateChild.Children.Add(TrueChild);

            AddLogicalChild(surrogateChild);
            Child = surrogateChild;
        }
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/222029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档