3

MouseDown イベント ハンドラー内に WPF Thumb オブジェクトを作成したいと考えています。ユーザーがマウスを押している限り、Thumb オブジェクトをドラッグできるはずです。ただし、マウス イベントは新しい Thumb オブジェクトに転送されません。実際、現在実行中のスレッドが猶予を受ける前に、オブジェクトが実際に作成されているとは思えません。Thumb をドラッグ モードで開始するにはどうすればよいですか? 入力優先度でコードをディスパッチした場合、プログラムで Thumb オブジェクトのドラッグ操作を開始するにはどうすればよいですか?

4

2 に答える 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) の位置に配置するという正味の効果があります。

[編集2]

動作するように更新されました。

于 2013-05-02T06:34:08.827 に答える