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