MouseDown イベント ハンドラー内に WPF Thumb オブジェクトを作成したいと考えています。ユーザーがマウスを押している限り、Thumb オブジェクトをドラッグできるはずです。ただし、マウス イベントは新しい Thumb オブジェクトに転送されません。実際、現在実行中のスレッドが猶予を受ける前に、オブジェクトが実際に作成されているとは思えません。Thumb をドラッグ モードで開始するにはどうすればよいですか? 入力優先度でコードをディスパッチした場合、プログラムで 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) の位置に配置するという正味の効果があります。
[編集2]
動作するように更新されました。
于 2013-05-02T06:34:08.827 に答える