使用操作事件移动窗口会导致窗口闪烁

本文关键字:窗口 闪烁 移动 操作 事件 | 更新日期: 2023-09-27 18:11:23

我正在尝试移动触摸设备上的窗口。我想使用操作事件,因为我还打算使用交互。

问题是,当我尝试向左或向右移动窗口时,窗口开始闪烁(这是由操作增量事件引起的,见后面)。

我能够将行为复制到以下示例中:

<Window x:Class="MultiTouchTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow"
    Width="525"
    Height="350"
    IsManipulationEnabled="True"
    ManipulationDelta="UIElement_OnManipulationDelta"
    WindowStyle="None" />

背后的代码:

public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void UIElement_OnManipulationDelta(object sender, ManipulationDeltaEventArgs e)
    {
        Debug.WriteLine(e.DeltaManipulation.Translation.X);
        Left += e.DeltaManipulation.Translation.X;
        e.Handled = true;
    }
}

和WriteLine()的输出是:

3
-3
3
-3
3
-3
3
-3
...

有人知道如何实现窗口移动使用操纵事件吗?

使用操作事件移动窗口会导致窗口闪烁

如果你改变了的Left属性,OnManipulationDelta事件会触发另一个新的相反值"e.DeltaManipulation.Translation.X"。不幸的是,在更改Left属性期间关闭事件并没有帮助。尝试使用以下代码:

public partial class MainWindow
{
    bool mCausedByCode = false;
    public MainWindow()
    {
        InitializeComponent();
    }
    private void UIElement_OnManipulationDelta(object sender, ManipulationDeltaEventArgs e)
    {
        Debug.WriteLine(e.DeltaManipulation.Translation.X);
        if(!mCausedByCode)
        {
            Left += e.DeltaManipulation.Translation.X;
            mCausedByCode = true;
        }
        else
        {
            mCausedByCode = false;
        }
        e.Handled = true;
    }
}

我在我的电脑上试过了,效果不错。