1

質問は非常に単純です:既にフォーカスされているコントロールでLostFocus発生するのを防ぐにはどうすればよいですか?MouseDown

次のコントロールがあります (すべてのイベント バインディングを使用した一時的なテスト)。

<Grid Name="gBase" Focusable="True" MouseUp="SetFocus" MouseDown="SetFocus" MouseMove="gBase_MouseMove" PreviewDragEnter="gBase_PreviewDragEnter" LostFocus="gBase_LostFocus" GotFocus="gBase_GotFocus"  Background="DarkRed" Width="500" Height="250" />

そして、次のコードビハインド:

private void SetFocus(object sender, MouseButtonEventArgs e)
{
    Grid g = sender as Grid;            
    g.Focus();
}

private void gBase_LostFocus(object sender, RoutedEventArgs e)
{
    Grid g = sender as Grid;
    g.Background = Brushes.DarkRed;

}

private void gBase_GotFocus(object sender, RoutedEventArgs e)
{
    Grid g = sender as Grid;
    g.Background = Brushes.Aquamarine;
}

private void gBase_MouseMove(object sender, MouseEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        Grid g = sender as Grid;
        g.Focus();
    }
}

private void gBase_PreviewDragEnter(object sender, DragEventArgs e)
{
    Grid g = sender as Grid;
    g.Focus();
}

グリッドをクリックすると、フォーカスが得られます。

問題は、グリッドが既にフォーカスを取得している場合、マウス ボタンを押している間にフォーカスが失われ、離すか移動するまで元に戻らないことです。私が好む動作は、そもそもフォーカスが失われないようにすることです。

4

2 に答える 2

2

問題は、親の ScrollViewer がフォーカスを奪うことでした。

これは、イベントを使用してtoをMouseLeftButtonDown設定して、イベントのそれ以上の処理を防止することで解決されました。MouseButtonEventArgs.Handledtrue

作業コード:

<Grid Name="gBase" Focusable="True" MouseLeftButtonDown="SetFocus" LostFocus="gBase_LostFocus" GotFocus="gBase_GotFocus" Background="DarkRed" MinWidth="500" MinHeight="250" Width="500" Height="250" HorizontalAlignment="Left" />
private void SetFocus(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;

    Grid g = sender as Grid;
    g.Focus();
}
于 2012-10-23T10:07:48.747 に答える
0

プロパティまたは変数を使用して、実際にどのコントロールにフォーカスがあるかを格納します。そして、MouseDown の後、コントロールが既にフォーカスを持っているかどうかを比較し、そうであれば、LostFocus イベントでコードを実行しないでください。

重要なのは、フォーカスが他のコントロールに変更されたときに、格納プロパティを更新することです。

于 2012-10-23T09:34:55.657 に答える