C# 在MouseDown中创建拇指并将其拖动?
我想在MouseDown事件处理程序中创建一个WPF Thumb对象。只要用户按住鼠标,就应该能够拖动Thumb对象。但是,鼠标事件不会转发到我的新Thumb对象。事实上,我怀疑这个对象是在当前执行的线程有一个缓期之前创建的。如何在拖动模式下启动拇指?如果我以输入优先级分派一些代码,我该如何以编程方式在Thumb对象上开始拖动操作?由于缺少代码,我假设您的意思是“在MouseDown事件处理程序中创建WPF Thumb对象”。以下就够了吗C# 在MouseDown中创建拇指并将其拖动?,c#,wpf,C#,Wpf,我想在MouseDown事件处理程序中创建一个WPF Thumb对象。只要用户按住鼠标,就应该能够拖动Thumb对象。但是,鼠标事件不会转发到我的新Thumb对象。事实上,我怀疑这个对象是在当前执行的线程有一个缓期之前创建的。如何在拖动模式下启动拇指?如果我以输入优先级分派一些代码,我该如何以编程方式在Thumb对象上开始拖动操作?由于缺少代码,我假设您的意思是“在MouseDown事件处理程序中创建WPF Thumb对象”。以下就够了吗 <Window x:Class="WpfAppli
<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>
[编辑]
这是一个“几乎”可行的例子。由于某种原因,在第一次thumb.DragDelta
时,r.HorizontalChange
和r.VerticalChange
的值不是鼠标三角洲的值,而是鼠标三角洲减去当前拇指位置的值,这具有将拇指置于(0,0)ish的净效果
[编辑二]
更新为工作状态。据我所知,拇指本身会检测到拖动操作,因此解决方案可能是让拇指始终处于不可见的位置(覆盖所有“可拖动”的客户端区域),并且仅在拖动时提供视觉反馈。然后,您可以使用thumb的拖放事件来检测这种情况。不过,我想解决的棘手问题是,无需再次单击即可拖动Thumb对象。您不能在第一次将Thumb位置的当前位置添加到
r.HorizontalChange
和r.VerticalChange
,以获得实际的Thumb.DragDelta
,您可以,但是如何确定这是第一次呢?我将最后一行更改为:Dispatcher.BeginInvoke(DispatcherPriority.Input,newaction(()=>thumb.RaiseEvent(e))代码>有趣的是,我想知道管道中是什么导致了这种情况。我觉得这与DragDelta
委托的创建有关,因为Canvas
还不知道Thumb
的位置。无论如何,集体工作总是有回报的:)
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)));
};
}