私のアプリケーションは、複数のビュー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>
私の2つのビューモデルは次のとおりです。
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>