我有一个简单的应用程序,它很小,应该漂浮在我所有其他窗口之上。几个小时后,我会注意到它不再是我所有其他窗户的顶部了,我想知道是否有人知道为什么会这样。
在此期间我打开了新的应用程序(主要是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中构建的。
答案 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>
即将为自己尝试此操作,因此如果符合详细信息,我会更新此答案。