根据鼠标位置移动WPF按钮,但它会闪烁。

4

我尝试根据鼠标位置移动按钮,但是当按钮被移动时它会闪烁。请参考下面的代码,

XAML代码如下:

        <Button Name="Samplebutton"
                PreviewMouseDown="Samplebutton_PreviewMouseDown"
                PreviewMouseUp="Samplebutton_PreviewMouseUp"
                PreviewMouseMove="Samplebutton_PreviewMouseMove"
                Content="Moving" Width="100" Height="35"/>

CS,

    private bool m_IsPressed = false;

    private void Samplebutton_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        if (e.ChangedButton == MouseButton.Left)
        {
            m_IsPressed = true;
        }
        else
        {
            m_IsPressed = false;
        }
    }

    private void Samplebutton_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        m_IsPressed = false;
    }

    private void Samplebutton_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        if (m_IsPressed)
        {
            TranslateTransform transform = new TranslateTransform();
            transform.X = Mouse.GetPosition(sender as Button).X;
            transform.Y = Mouse.GetPosition(sender as Button).Y;
            this.Samplebutton.RenderTransform = transform;
        }
    }

请问有人可以提供建议吗?

2个回答

3
你的“闪烁”是由于你的PreviewMouseMove处理程序中的变换引起的。
你正在使用鼠标相对于按钮控件的位置转换控件的X和Y位置,这将在每次应用变换时发生更改。每当按钮位置发生更改时,你的Mouse.GetPosition(sender as Button).XY将返回不同的值,导致按钮再次改变位置,以此类推。
解决这个问题的一种方法是从父元素(例如Grid、带有固定位置的Canvas)获取鼠标位置:
<Grid Name="myGrid">
    <Button Name="Samplebutton"
            PreviewMouseDown="Samplebutton_PreviewMouseDown"
            PreviewMouseUp="Samplebutton_PreviewMouseUp"
            PreviewMouseMove="Samplebutton_PreviewMouseMove"
            Content="Moving" Width="100" Height="35"/>
</Grid>

并且

private void Samplebutton_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        if (m_IsPressed)
        {
            TranslateTransform transform = new TranslateTransform();
            transform.X = Mouse.GetPosition(myGrid).X;
            transform.Y = Mouse.GetPosition(myGrid).Y;
            this.Samplebutton.RenderTransform = transform;
        }
    }

这可能不是世界上最美观的事物,因为它会从左上角“抓取”按钮,但您可以调整位置以获得所需的行为。

祝你好运。

编辑:如果您不想明确命名要用于相对位置的元素,则可以通过查询 sender 对象来选择其直接父级:

transform.X = Mouse.GetPosition((sender as Button).Parent as FrameworkElement).X;

谢谢,我会检查并告诉你。 - Muthalagu

1
 private void button_PreviewMouseDown_1(object sender, MouseButtonEventArgs e)
    {
        button.CaptureMouse();
    }

    private void button_PreviewMouseUp_1(object sender, MouseButtonEventArgs e)
    {
        button.ReleaseMouseCapture();
    }

    private void button_PreviewMouseMove_1(object sender, MouseEventArgs e)
    {

        if (button.IsMouseCaptured)
        {
            Canvas.SetLeft(button, e.GetPosition(this).X);
            Canvas.SetTop(button, e.GetPosition(this).Y);

        }
    }

谢谢你的尝试,但我不想通过Canvas来实现这个。 - Muthalagu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接