1

wpf でウィンドウの周りの行を正常に移動できますが、正しく機能していません。カーソルがドラッグしている線よりも速い場合のようなものです。コードをテストして、何が問題なのかを確認できます。

public partial class MainWindow : Window
{
    Line line = new Line();
    Point p ; 
    bool isdragging = false;

    public MainWindow()
    {
        InitializeComponent();
        canvas1.Children.Add(line);
        Thickness thickness = new Thickness(101, -11, 362, 250);
        line.Margin = thickness;
        line.Visibility = System.Windows.Visibility.Visible;
        line.StrokeThickness = 4;
        line.Stroke = System.Windows.Media.Brushes.Black;
        line.X1 = 10;
        line.X2 = 200;
        line.Y1 = 0;
        line.Y2 = 70;
        line.MouseDown+=new MouseButtonEventHandler(line_MouseDown);
        line.MouseMove+=new MouseEventHandler(line_MouseMove);
        line.MouseUp+=new MouseButtonEventHandler(line_MouseUp);

    }

    public void line_MouseDown(object sender, MouseButtonEventArgs e)
    {
        isdragging = true;
        p = e.GetPosition(canvas1);
    }
    public void line_MouseMove(object sender, MouseEventArgs e)
    {
        if (isdragging == true && e.LeftButton == MouseButtonState.Pressed)
        {
            line.X1 += e.GetPosition(canvas1).X - p.X;
            line.X2 += e.GetPosition(canvas1).X - p.X;
            line.Y1 += e.GetPosition(canvas1).Y - p.Y;
            line.Y2 += e.GetPosition(canvas1).Y - p.Y;

        }
    }
    public void line_MouseUp(object sender, MouseButtonEventArgs e)
    {
        isdragging = false;
    }
}
}
4

3 に答える 3

2

本当にスムーズなドラッグが必要な場合は、 をラップしてLine、イベントをThumb使用しDragDeltaて新しい位置を計算できるようにすることができます。

例:

Xaml:

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="233" Width="405" Name="UI">
    <Canvas>
        <Thumb DragDelta="onDragDelta" Canvas.Left="0" Canvas.Top="0" >
            <Thumb.Template>
                <ControlTemplate>
                    <Line X1="10" X2="200" Y1="0" Y2="70" StrokeThickness="4" Stroke="Black"/>
                </ControlTemplate>
            </Thumb.Template>
        </Thumb>
    </Canvas>
</Window>

コード:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    void onDragDelta(object sender, DragDeltaEventArgs e)
    {
        var thumb = sender as Thumb;
        Canvas.SetLeft(thumb, Canvas.GetLeft(thumb) + e.HorizontalChange);
        Canvas.SetTop(thumb, Canvas.GetTop(thumb) + e.VerticalChange);
    }
}
于 2013-01-28T23:25:51.197 に答える
0

助けてくれてありがとう!私はその問題を解決したと思います.mのときにマウスのキャプチャを購入し、マウスのボタンを離した後にマウスのキャプチャを解放します。それはうまく動作します。みんなありがとう!

于 2013-01-29T09:33:31.213 に答える
0

マウス移動イベントごとに線を移動しています。これにより、マウスがわずかに移動するたびに、コードが新しい位置に線を再描画しようとします。

位置を追跡し、マウスが一定量以上移動した場合にのみ線を再描画できます。

public void line_MouseMove(object sender, MouseEventArgs e)
{
    if (isdragging == true && e.LeftButton == MouseButtonState.Pressed)
    {
        Point newPos = e.GetPosition(canvas1);
        if (Size(p, newPos) > 10)
        {
            line.X1 += newPos.X - p.X;
            line.X2 += newPos.X - p.X;
            line.Y1 += newPos.Y - p.Y;
            line.Y2 += newPos.Y - p.Y;
            p = newPos;
        }
    }
}

Whereは からまでSizeの距離を計算するメソッドです。pnewPos

次に、マウスが離されたときに最終的な更新を追加して、ユーザーが期待する場所で行が終了するようにするだけです。

public void line_MouseUp(object sender, MouseButtonEventArgs e)
{
    Point newPos = e.GetPosition(canvas1);
    line.X1 += newPos.X - p.X;
    line.X2 += newPos.X - p.X;
    line.Y1 += newPos.Y - p.Y;
    line.Y2 += newPos.Y - p.Y;
    isdragging = false;
}
于 2013-01-28T22:23:42.240 に答える