0

コントロールが少ないダイアログがあります。TextBox名前付きのtxtControlと2つのButtons AcceptCancelがあります。フォーカスがtxtControlに入ると、[承認]または[キャンセル]ボタンクリックするまで、フォーカスが消えないようにします。

[承認]または[キャンセル]ボタンをクリックせずに他のコントロールをクリックしようとすると、フォーカスはtxtControlに残ります。また、他のコントロールを無効にしたり、グレー表示したりしたくありません。

4

4 に答える 4

1

フォーカスが txtControl にあり、マウスが txtControl、Accept、または Cancel の上にないときはいつでも、ルートで OnPreviewMouseDown を処理できます。

void mainWindow_previewMouseDown(object sender, MouseEventArg e)
{

     if (txtControl.IsFocusWithin)         
     {
          if (txtControl.IsMouseOver == false ||
             accept.IsMouseOver ==false ||
             cancel.IsMouseOver ==false)
          {
              e.Handle = true;
          }
      }
}

また、タブが押されているかどうかを確認するために PreviewKeyDown を使用することもできます。

于 2012-12-07T09:59:11.087 に答える
0

この種の制限は得策ではありません。

マウスを使用できず、タブ キーを使用してコントロール間を移動するユーザーがアプリをどのように使用するか?

于 2012-12-07T10:02:26.223 に答える
0

キーボード フォーカスを失ったテキスト ボックスを探す添付プロパティを作成し、フォーカスをテキスト ボックスに強制的に戻します。

添付プロパティは次のようになります。

  public class TextBoxExtras : DependencyObject
    {
        public static bool GetRetainsFocus(DependencyObject obj)
        {
            return (bool)obj.GetValue(RetainsFocusProperty);
        }

        public static void SetRetainsFocus(DependencyObject obj, bool value)
        {
            obj.SetValue(RetainsFocusProperty, value);
        }

        public static readonly DependencyProperty RetainsFocusProperty =
            DependencyProperty.RegisterAttached("RetainsFocus", typeof(bool), typeof(TextBoxExtras), new PropertyMetadata(false, new PropertyChangedCallback((s, e) =>
                {
                    TextBox textBox = s as TextBox;
                    if (textBox != null)
                    {
                        if (!(bool)e.NewValue && (bool)e.OldValue)
                            textBox.LostKeyboardFocus -= textBox_LostKeyboardFocus;
                        if ((bool)e.NewValue)
                        {
                            textBox.LostKeyboardFocus += textBox_LostKeyboardFocus;
                            textBox.Unloaded += textBox_Unloaded;
                        }
                    }
                })));

        static void textBox_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
        {
            TextBox textBox = sender as TextBox;
            if (textBox != null )
                if (textBox.Focusable)
                    textBox.Focus();
        }

        static void textBox_Unloaded(object sender, RoutedEventArgs e)
        {
            TextBox textBox = sender as TextBox;
            if (textBox != null)
            {
                textBox.LostKeyboardFocus -= textBox_LostKeyboardFocus;
                textBox.Unloaded -= textBox_Unloaded;
            }
        }
    }

そして、このように XAML で使用します。最初のテキスト ボックスは、「フォーカスを保持する」ものです。

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication4"
        Background="Black"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox local:TextBoxExtras.RetainsFocus="True" Margin="10,10,387,283"/>        
        <TextBox HorizontalAlignment="Left" Height="23" Margin="10,37,0,260" Width="120" />
        <Button Content="Accept" HorizontalAlignment="Left" Margin="10,81,0,0" VerticalAlignment="Top" Width="75" />
    </Grid>
</Window>
于 2012-12-07T13:58:23.453 に答える
0

ルート レベルでPreviewLostKeyboardFocusを処理できます。

xamlで

<Window ... PreviewLostKeyboardFocus="Win_PreviewLostKeyboardFocus">

C# の場合

private void Win_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
        // change focus behavior only when txtControl 
                          // is the element losing focus
        if (e.OldFocus != txtControl)
            return;

                          // if new element with focus is not Accept and is not Cancel, then disable the focus change
        if (e.NewFocus != Accept && e.NewFocus != Cancel)
            e.Handled = true;
    }
于 2012-12-07T11:01:49.957 に答える