テストの目的で、2つのウィンドウを含む単純なアプリケーションを作成しました。
a)MainWindow
次のように定義されたボタン付き:
<Button Content="Button" HorizontalAlignment="Left" Margin="53,36,0,0" VerticalAlignment="Top" Width="75" Click="HandlerButtonOnClick"/>
次にHandlerButtonOnClick
定義されます:
/// <summary>
/// The handler button on click.
/// </summary>
private void HandlerButtonOnClick(object sender, RoutedEventArgs e)
{
new WindowWithButton().ShowDialog();
}
b)WindowWithButton
1つのボタンが定義された単純なウィンドウです。
<Button Content="Button" HorizontalAlignment="Left" Margin="47,47,0,0" VerticalAlignment="Top" Width="75" Command="{Binding Path=Click, ElementName=clickWindow}"/>
ここclickWindow
で、はウィンドウの名前です。
2番目のウィンドウでは、コマンドプロパティを次のように定義しています。
/// <summary>
/// The click.
/// </summary>
private ICommand click;
/// <summary>
/// Gets the click.
/// </summary>
public ICommand Click
{
get
{
return this.click ?? (this.click = new RelayCommand(
obj => MessageBox.Show("Click"),
obj =>
{
Debug.WriteLine("Click queried");
return true;
}));
}
}
私の問題は次のとおりです。これがいつ呼び出されるかを確認する行を追加しましDebug.WriteLine("Click queried");
たが、フォーカスウィンドウだけで呼び出されるのではないことに気付きました。WindowWithButton
閉じていても呼ばれます。つまり、ボタンを押してから、MainWindowを閉じWindowWithButton
てアクティブにし、そのCanExecute部分が呼び出されます。実行可能な呼び出しを停止することはありません。ウィンドウを開くたびに、別の実行が追加されます。したがって、ウィンドウを何度も開くと、このコードの実行が増加します。ウィンドウがアンロードされても、実行は停止しませんでした。
この動作を停止するにはどうすればよいですか。アプリケーションの安定性とメモリ使用量、およびパフォーマンスに深刻な問題が発生する可能性があるためです。