为什么TopMost = True并不总是有效?

时间:2011-02-21 14:12:16

标签: wpf topmost

我有一个简单的应用程序,它很小,应该漂浮在我所有其他窗口之上。几个小时后,我会注意到它不再是我所有其他窗户的顶部了,我想知道是否有人知道为什么会这样。

在此期间我打开了新的应用程序(主要是MS 2010产品),几次锁定/解锁我的电脑,点击桌面快捷方式,并在屏幕上移动应用程序(有时在屏幕之间,因为我有两台显示器)

我无法按需复制行为,但每天至少发生一次。当它停在顶部时,它会在我点击桌面快捷方式时隐藏,所以我认为TopMost属性被设置为false。

<Window AllowsTransparency="True" 
        WindowStyle="None"
        Topmost="True"
        SizeToContent="WidthAndHeight"
        MouseDown="Window_MouseDown"
        ShowInTaskbar="False"
        Background="Transparent" 
        SnapsToDevicePixels="True">

该应用程序非常简单......它就像一个虚拟的国际象棋时钟,让我跟踪处理帮助台呼叫与实际开发所花费的时间。 MouseDown事件只是触发应用程序的拖放行为,因为WindowStyle设置为None。

我正在运行WindowsXP,该应用程序是在.Net 4.0中构建的。

3 个答案:

答案 0 :(得分:3)

也许您可以捕获Deactivated事件,并再次强制窗口重新开启?

真是猜测,但是如果在正确的时间设置Topmost = False然后Topmost = True修复它,则值得调查。

答案 1 :(得分:1)

替代解决方案

WPF MainWindow中的

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

    private delegate void MessageBoxDelegate(DelegatePara para);

    public void ShowAwMessageBox(DelegatePara para)
    {            
        this.Dispatcher.BeginInvoke(new MessageBoxDelegate(ShowMessageBox), para);
    }

    private void ShowMessageBox(DelegatePara para)
    {
        this.Topmost = true;
        int typ = para.count;
        string msg = para.Msg;
        switch (typ)
        {
            case 0:
                MessageBox.Show(this, msg, "Auswertung", MessageBoxButton.OK, MessageBoxImage.Information);
                break;
            case 1:
                MessageBox.Show(this, msg, "Auswertung", MessageBoxButton.OK, MessageBoxImage.Error);
                break;
            case 2:
                MessageBox.Show(this, msg, "Auswertung", MessageBoxButton.OK, MessageBoxImage.Question);
                break;
            default:
                MessageBox.Show(this, msg, "Auswertung", MessageBoxButton.OK, MessageBoxImage.Information);
                break;
        }
    }
}

 public class DelegatePara
 {
    public int count {get;set; }
    public string Msg {get;set; }
 }
}

然后你可以在任何你想要的地方使用MainWind句柄调用它,即使是在一个线程中

this.MyWind.ShowRlvAwMessageBox(new DelegatePara() { count = 0, Msg = "Hallo World!" });

答案 2 :(得分:0)

这个问题已经很老了,但我还没有找到任何真正的解决方案,所以这是我对其他任何人都有这个问题的想法:

尝试Tom的建议,但不要只检查TopMost是否使用ShowWindowAsync强制它再次显示。

只有这可能是一个问题,它可以将焦点从活动应用程序移开,但我知道有一种方法可以使它成为一个“无焦点”的形式,如果这是你的选择。 / p>

即将为自己尝试此操作,因此如果符合详细信息,我会更新此答案。