我想在MouseDown事件处理程序中创建一个WPF Thumb对象。只要用户按住鼠标,他们就应该能够拖动Thumb对象。然而,鼠标事件没有转发到我的新Thumb对象。事实上,在当前执行线程有休息之前,我怀疑对象是否真正被创建。如何启动Thumb的拖动模式?如果我以Input优先级分派一些代码,我可以在Thumb对象上编程开始拖动操作,具体方法是什么?
我想在MouseDown事件处理程序中创建一个WPF Thumb对象。只要用户按住鼠标,他们就应该能够拖动Thumb对象。然而,鼠标事件没有转发到我的新Thumb对象。事实上,在当前执行线程有休息之前,我怀疑对象是否真正被创建。如何启动Thumb的拖动模式?如果我以Input优先级分派一些代码,我可以在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.HorizontalChange
和 r.VerticalChange
的值不是鼠标增量,而是鼠标增量减去当前拇指位置,这会将拇指放置在(0,0)左右。
[编辑2]
已更新为正常工作。
r.HorizontalChange
和 r.VerticalChange
中,以便获得实际的 thumb.DragDelta
? - StefanDispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() => thumb.RaiseEvent(e)));
- BrannonCanvas
还不知道Thumb
位置时就已经创建了DragDelta
委托所致。无论如何,集体的努力总是会得到回报的 :) - StaWho我改进了来自@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);
};