1

我有一个简单的应用程序,它很小,应该漂浮在我所有其他窗口的顶部。几个小时后,我会注意到它不再位于我所有其他窗口的顶部,我想知道是否有人知道为什么会发生这种情况。

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

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

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

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

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

4

3 回答 3

3

也许您可以捕获Deactivated事件,并再次强制 Window 回到顶部?

只是一个猜测,但如果在正确的时间设置Topmost = FalsethenTopmost = True修复它,那将是值得研究的。

于 2011-02-21T14:29:20.760 回答
1

替代解决方案

在您的 WPF 主窗口中

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!" });
于 2012-09-06T13:36:45.213 回答
0

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

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

唯一可能成为问题的是它可以将焦点从活动应用程序中移开,但我知道如果您可以选择的话,有一种方法可以使其成为“无焦点”形式。

即将为自己尝试这个,所以如果它适用于细节,我会更新这个答案。

于 2014-03-17T20:01:30.727 回答