Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MouseDown中创建拇指并将其拖动?_C#_Wpf - Fatal编程技术网

C# 在MouseDown中创建拇指并将其拖动?

C# 在MouseDown中创建拇指并将其拖动?,c#,wpf,C#,Wpf,我想在MouseDown事件处理程序中创建一个WPF Thumb对象。只要用户按住鼠标,就应该能够拖动Thumb对象。但是,鼠标事件不会转发到我的新Thumb对象。事实上,我怀疑这个对象是在当前执行的线程有一个缓期之前创建的。如何在拖动模式下启动拇指?如果我以输入优先级分派一些代码,我该如何以编程方式在Thumb对象上开始拖动操作?由于缺少代码,我假设您的意思是“在MouseDown事件处理程序中创建WPF Thumb对象”。以下就够了吗 <Window x:Class="WpfAppli

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

由于缺少代码,我假设您的意思是“在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>
[编辑]

这是一个“几乎”可行的例子。由于某种原因,在第一次
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)));
        };
    }