在MouseDown中创建Thumb并将其拖动?

时间:2013-04-30 04:16:14

标签: c# wpf

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

1 个答案:

答案 0 :(得分: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.DragDeltar.HorizontalChanger.VerticalChange的值不是鼠标增量值,而是鼠标增量减去当前拇指位置,这会产生将拇指置于(0)的净效果,0)ish。

[EDIT2]

已更新至正在使用。