在MouseDown事件中创建缩略图并拖动它?

3

我想在MouseDown事件处理程序中创建一个WPF Thumb对象。只要用户按住鼠标,他们就应该能够拖动Thumb对象。然而,鼠标事件没有转发到我的新Thumb对象。事实上,在当前执行线程有休息之前,我怀疑对象是否真正被创建。如何启动Thumb的拖动模式?如果我以Input优先级分派一些代码,我可以在Thumb对象上编程开始拖动操作,具体方法是什么?


1
据我所知,滑块本身应该能够自动检测拖动操作,因此解决方案可以是始终将滑块隐形地放置在原位(覆盖所有可拖动的客户区域),只在拖动时提供视觉反馈。然后,您可以使用滑块的拖放事件来检测这种情况。 - hbarck
2个回答

4
因为缺少代码,我假设你真正的意思是在MouseDown事件处理程序中创建WPF Thumb对象。下面的内容是否足够清楚明了?
<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Canvas Name="RootCanvas" Background="White"/>
</Window>

    public MainWindow()
    {
        InitializeComponent();
        RootCanvas.MouseDown += (s, e) =>
        {
            Thumb thumb = new Thumb();
            thumb.Width = thumb.Height = 35;
            thumb.Background = new SolidColorBrush(Colors.Red);

            Canvas.SetLeft(thumb, e.GetPosition((Canvas)s).X - thumb.Width / 2);
            Canvas.SetTop(thumb, e.GetPosition((Canvas)s).Y - thumb.Height / 2);

            thumb.DragDelta += (d, r) =>
            {
                Canvas.SetLeft((UIElement)d, Canvas.GetLeft((UIElement)d) + r.HorizontalChange);
                Canvas.SetTop((UIElement)d, Canvas.GetTop((UIElement)d) + r.VerticalChange);
            };

            ((Canvas)s).Children.Add(thumb);
            Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() => thumb.RaiseEvent(e)));
        };
    }

[编辑]

这是一个“几乎”工作的示例。由于某种原因,在第一次 thumb.DragDelta 时,r.HorizontalChanger.VerticalChange 的值不是鼠标增量,而是鼠标增量减去当前拇指位置,这会将拇指放置在(0,0)左右。

[编辑2]

已更新为正常工作。


我很感谢您发布示例代码。不过,我想要解决的棘手问题是能够拖动那个Thumb对象而无需再次点击。 - Brannon
你能否在第一次时将拇指位置的当前位置添加到 r.HorizontalChanger.VerticalChange 中,以便获得实际的 thumb.DragDelta - Stefan
你可以这样做,但是你如何确定这是第一次? - StaWho
1
我通过将最后一行更改为以下内容使其工作:Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() => thumb.RaiseEvent(e))); - Brannon
有趣的是,我不知道pipeline中的哪个部分引起了这个问题。我感觉可能是在Canvas还不知道Thumb位置时就已经创建了DragDelta委托所致。无论如何,集体的努力总是会得到回报的 :) - StaWho

0

我改进了来自@StaWho的代码,因为将RootCanvas放入ScrollViewer中时会出现异常行为。

RootCanvas.MouseDown += (s, e) =>
{
    Thumb thumb = new Thumb();
    thumb.Width = thumb.Height = 35;
    thumb.Background = new SolidColorBrush(Colors.Red);

    Canvas.SetLeft(thumb, e.GetPosition((Canvas)s).X - thumb.Width / 2);
    Canvas.SetTop(thumb, e.GetPosition((Canvas)s).Y - thumb.Height / 2);

    thumb.DragDelta += (d, r) =>
    {
        var mousePosition = Mouse.GetPosition(RootCanvas);
        Canvas.SetLeft((UIElement)d, mousePosition.X);
        Canvas.SetTop((UIElement)d, mousePosition.Y);
    };

    ((Canvas)s).Children.Add(thumb);
    thumb.RaiseEvent(e);
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接