我的应用程序是多个视图之间的最高Window
切换。UserControl
它的行为是当用户在窗口外单击时关闭(更常见的是当它失去焦点时),并在用户单击系统托盘图标时再次显示。
单击托盘图标后,当窗口显示时,我无法获得焦点。问题是窗口显示时没有焦点,并且当用户点击外部时它不会隐藏。用户必须先点击窗口,然后点击外部才能触发窗口Deactivated
事件。
我可以使用文档中最基本的示例重现该问题。我在下面展示了我可以产生的问题的最基本表示。
我尝试了许多不同的事情,但没有一个表现出任何不同的行为。例如,我尝试Focus()
在视图模型的 OnViewLoaded 处理程序中调用视图并停用视图模型,而不是在Close
操作中关闭窗口。我也尝试过这个似乎是同样问题的建议。
任何有关如何执行此操作的提示或帮助将不胜感激。
[Export(typeof(ShellViewModel))]
public class ShellViewModel : Conductor<object>
{
IWindowManager windowManager;
[ImportingConstructor]
public ShellViewModel(IWindowManager windowManager)
{
this.windowManager = windowManager;
ShowPageOne();
}
public void ShowPageOne()
{
ActivateItem(new PageOneViewModel());
}
public void ShowPageTwo()
{
ActivateItem(new PageTwoViewModel());
}
public void Close()
{
this.TryClose();
// Using this to simulate the user clicking on a system tray icon
var timer = new Timer();
timer.Tick += (s, e) =>
{
windowManager.ShowWindow(this);
timer.Stop();
};
timer.Interval = 1000;
timer.Start();
}
}
我的 ShellView 是:
<Window x:Class="PopupTest.ShellView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:tc="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"
xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"
Width="300" Height="400"
cal:Message.Attach="[Event Deactivated] = [Action Close]"
Topmost="True">
<StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button x:Name="ShowPageOne" Content="Show Page One" />
<Button x:Name="ShowPageTwo" Content="Show Page Two" />
</StackPanel>
<ContentControl x:Name="ActiveItem" />
</StackPanel>
我的两个视图模型是:
public class PageOneViewModel : Caliburn.Micro.Screen { }
public class PageTwoViewModel : Caliburn.Micro.Screen { }
意见是:
<UserControl x:Class="PopupTest.PageOneView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TextBlock x:Name="bob" FontSize="32">Page One</TextBlock>
</UserControl>