3

我想在 MouseDown 事件处理程序中创建一个 WPF Thumb 对象。只要用户按住鼠标,他们应该能够拖动 Thumb 对象。但是,鼠标事件不会转发到我的新 Thumb 对象。事实上,我怀疑该对象实际上是在当前执行的线程获得缓刑之前创建的。如何在拖动模式下启动 Thumb?如果我以 Input 优先级调度一些代码,我可以做些什么来以编程方式开始对 Thumb 对象的拖动操作?

4

2 回答 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)));
        };
    }

[编辑]

这是“几乎”工作的例子。出于某种原因, firstthumb.DragDelta的值r.HorizontalChanger.VerticalChange不是鼠标增量的值,而是鼠标增量减去当前拇指位置,这具有将拇指置于 (0,0) ish 的净效果。

[编辑2]

更新到工作。

于 2013-05-02T06:34:08.827 回答
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);
};
于 2021-12-01T14:51:02.430 回答