WPF:如何防止用户离开 TextBox?

4

我曾经赢过其他战斗,但在这一战中却失败了--因为我们的设计有时会强制用户填写某些字段。显然,代码示例过于简化。如果需要提供更多细节,请告诉我。

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上启动并聚焦/定位光标。该TextBox的PreviewLostKeyboardFocus处理程序防止用户使用键盘或鼠标将焦点移动到textBox2。
但是,用户可以使用鼠标将焦点移动到comboBox1。
为什么用户可以使用鼠标将焦点移动到comboBox1,我如何强制用户保留在textBox1中?

组合框从不“获得”焦点,只是被点击以打开它。这是完全不同的交互方式。您可能需要禁用组合框或以其他方式防止其接收某些事件。 - Jeff Mercado
1
这感觉像是一个糟糕的设计。我不喜欢出现一个不能被点击/编辑的UI控件。也许你应该实现一个向导式的UI来强制执行顺序。这只会让人感到困惑。 - Emond
如果您不希望控件获得焦点,应将其禁用。 - djdanlib
3个回答

1

怎么样?

    public MainWindow()
    {
        InitializeComponent();

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

?


1
尝试一下:
comboBox1.IsHitTestVisible = false;

我不知道IsHitTestVisible。谢谢。我理想地寻找一个完全存在于textBox1上的实施。 - lance
明白了。我认为问题在于单击组合框不会改变键盘焦点。另一种方法可能是将所有防止此类情况发生的代码放在窗口类上(从textBox1中提取出来)。我将把这个方法作为第二个答案。 - Mark Synowiec

0

你也可以在窗口层面上处理它:

    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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接