WPF: запретить пользователю покидать TextBox? - PullRequest
4 голосов
/ 15 июня 2011

Я выиграл другие битвы и проиграл эту - где наш дизайн иногда вынуждает пользователей к полям. Очевидно, примеры кода упрощены. Дайте мне знать, если мне нужно где-нибудь предоставить более подробную информацию.

XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <TextBox Height="23" Margin="5,5,0,0" Name="textBox1" />
        <TextBox Height="23" Margin="5,65,0,0" Name="textBox2" />
        <ComboBox Height="23" Margin="5,125,0,0" Name="comboBox1" >
            <ComboBoxItem Content="Lorem Ipsum" />
        </ComboBox>
    </Grid>
</Window>

XAML.CS:

using System.Windows.Input;

namespace WpfApplication1 {
    public partial class MainWindow {
        public MainWindow() {
            InitializeComponent();
            textBox1.Focus();
            textBox1.PreviewLostKeyboardFocus += Foo;
        }

        void Foo(object sender, KeyboardFocusChangedEventArgs e) {
            e.Handled = true;
        }
    }
}

Приложение запускает с фокусом / курсором на textBox1 по умолчанию. Обработчик PreviewLostKeyboardFocus этого TextBox не позволяет пользователю перемещать фокус на textBox2 с помощью клавиатуры или мыши.

Но пользователь может с помощью мыши перемещать фокус на comboBox1.

Почему пользователь может перемещать фокус на comboBox1 с помощью мыши и как заставить пользователя оставаться в textBox1?

Ответы [ 3 ]

1 голос
/ 15 июня 2011

Попробуйте:

comboBox1.IsHitTestVisible = false;

1 голос
/ 15 июня 2011

Как насчет

    public MainWindow()
    {
        InitializeComponent();

        textBox1.Focus();
        textBox1.LostFocus += (s, e) => 
                   Dispatcher.BeginInvoke((Action)(() => textBox1.Focus()));
    }

0 голосов
/ 15 июня 2011

Вы также можете просто обработать это на уровне окна:

    public MainWindow()
    {
        InitializeComponent();
        textBox1.Focus();
        this.PreviewMouseDown += new MouseButtonEventHandler(MainWindow_PreviewMouseDown);
        this.PreviewKeyDown += new KeyEventHandler(MainWindow_PreviewKeyDown);
    }

    void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Tab) e.Handled = true;
    }

    void MainWindow_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        e.Handled = true;
    }
...