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在 a 中Thumb,以便您可以使用该DragDelta事件来计算新位置。

例子:

xml:

<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

您在每次鼠标移动事件后移动线。这将导致代码在鼠标的每一次轻微移动后尝试在新位置重新绘制线条 - 甚至是一个像素。

您可以跟踪位置并仅在鼠标移动超过一定量时才重绘线:

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;
        }
    }
}

whereSize是一种计算从p到的距离的方法newPos

然后,您只需要在释放鼠标时添加最终更新,以便该行最终到达用户期望的位置:

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 回答
0

谢谢你们的帮助!!我想我解决了这个问题,当我是 m 时购买​​捕获鼠标,并在释放鼠标按钮后释放鼠标捕获。它工作得很好。再次感谢你们!

于 2013-01-29T09:33:31.213 回答