Динамическое предотвращение фокусировки текстового поля

#c# #wpf #dynamic #textbox #focus

#c# #wpf #динамическое #текстовое поле #фокус

Вопрос:

У меня есть System.Windows.Controls.TextBox объект, который я хотел бы вести себя следующим образом: когда вы нажимаете на него, динамически определяется TextBox , получает ли он фокус или нет. Вот игрушечное приложение, которое содержит неудачную попытку выполнить это:

 <!-- MainWindow.xaml -->
<Window x:Class="Focus.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Label Name="myLabel" Grid.Row="0" Background="Red"></Label>
        <TextBox Name="myTextbox" Grid.Row="1" Background="Green"></TextBox>
    </Grid>
</Window>

// MainWindow.xaml.cs
using System;
using System.Windows;
using System.Windows.Input;

namespace Focus
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            myTextbox.PreviewGotKeyboardFocus  = myTextbox_GotKeyboardFocus;
        }

        private static readonly Random myRandom = new Random();

        private void myTextbox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
        {
            int randomInt = myRandom.Next(0, 2); // 0 or 1
            myLabel.Content = randomInt;
            if(randomInt==0)
            {
                // PREVENT FOCUS - INSERT CODE HERE. (The line below is a failed attempt.)
                FocusManager.SetFocusedElement(this, myLabel);
            }
        }
    }
}
  

Ответ №1:

Следующий код, похоже, делает свое дело:

 // PREVENT FOCUS - INSERT CODE HERE.
myLabel.Focusable = true;
myLabel.Focus();
myLabel.Focusable = false;
  

Я также изменил эту строку кода:

 myTextbox.PreviewGotKeyboardFocus  = myTextbox_GotKeyboardFocus;
  

в это:

 myTextbox.GotFocus  = myTextbox_GotKeyboardFocus;
  

Ответ №2:

Я надеюсь, вы знаете, что вы подключились к фокусу клавиатуры (клавиша табуляции).

 void textBox1_GotFocus(object sender, System.EventArgs e)
{
    if (!this.checkBox1.Checked)
        this.checkBox1.Focus();

    else
        this.textBox1.Focus();

}
  

Комментарии:

1. Событие GotKeyboardFocus также запускается при щелчке текстового поля.

2. Я попытался включить вашу идею в свой пример кода (вызвав myLabel . Focus()), и, к сожалению, это, похоже, не работает.