0

我有一个非常奇怪的问题:

  • 在我的 C# 代码中,如果我设置“Topmost”属性,则窗口不会停留在顶部。
  • 但是,如果我在 Snoop 中切换相同的属性,窗口将保持在顶部。

我的问题是:Snoop 在做什么来强制窗口刷新?

在此处输入图像描述

我试过的

我尝试了以下方法:

  • window.UpdateLayout();
  • window.InvalidateVisual();
  • 添加后台任务以持续设置此属性。
  • 设置TopMostfalse,然后true,以触发 DependencyProperty 刷新。
4

1 回答 1

0

事实证明,Snoop 并没有做任何特别的事情。

如果我再等 500 毫秒,它就会起作用:

Task task = Task.Run(
    async () =>
    {
        // Without this delay, the change will not work.
        await Task.Delay(TimeSpan.FromMilliseconds(500));

        Application.Current.Dispatcher.Invoke(
            () =>
            {
                floatingPaneWindow.Topmost = true;
                {
                    if (window.Top < 0)
                    {
                        window.Top = 0;
                    }
                        if (window.Left < 0)
                    {
                        window.Left = 0;
                    }
                }                                               
            });
    });

当然,将特定时间添加到应用程序中非常麻烦,因此我目前正在寻找一些方法来确定窗口是否设置正确。

更新

谜题解决了,使用Dispatcher选择合适的优先级,参见WPF: In an attach property, how to wait until visual tree加载正确?

于 2016-03-16T13:27:10.183 回答