Программно сфокусировать элемент пользовательского интерфейса, который был повторно включен в предыдущем выражении - PullRequest
0 голосов
/ 11 июля 2011

Я разрабатываю форму, и одно из требований к ней заключается в том, чтобы большинство полей были отключены до тех пор, пока не будут заполнены первые два поля.Для удобства использования я хочу, чтобы он был настроен таким образом, чтобы после того, как вы вышли из второго поля (Field_Two.LostFocus), остальные поля были включены, отображены, и первое из этих полей сфокусировано.Код, который у меня есть в настоящее время, устанавливает видимость всех полей в visibility.hidden при запуске.В настоящее время он выполняет фокус Field_One (следующий в порядке табуляции включенных полей), но я подтвердил, что условия выполнены правильно и выполнение продолжается после оператора return.

Field.beenFocused - это переменнаяЯ создал, что инициализируется как false, а затем устанавливается в true, когда поле фокусируется впервые, мой класс Field расширяет TextBox;все мои элементы управления, кроме Field_One и Field_Two, находятся в панелях стека.

C #

        void Field_Two_LostFocus(object sender, RoutedEventArgs e)
    {
        if (!Field_Three.beenFocused)
        {

            if (String.IsNullOrWhiteSpace(Field_One.Text) || String.IsNullOrWhiteSpace(Field_Two.Text))
                return;

            foreach (object u in ApplicationGrid.Children)
                if (u.GetType() == typeof(StackPanel))
                        ((StackPanel)u).IsEnabled = true;

            do { Field_Three.Focus(); }
            while (!Field_Three.beenFocused);
        }
    }

1 Ответ

0 голосов
/ 11 июля 2011

Вы можете попробовать включить / отключить событие TextChanged, а не событие LostFocus.

Вот пример кода.

MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <TextBox Name="textBox1" TextChanged="ValidateInitialFieldsOnChange"
                 Height="23" Width="120" />
        <TextBox Name="textBox2" TextChanged="ValidateInitialFieldsOnChange"
                 Height="23" Width="120" />
        <TextBox Name="textBox3" IsEnabled="False" Height="23" Width="120" />
    </StackPanel>
</Window>

MainWindow.xaml.cs:

using System.Windows;
using System.Windows.Controls;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void ValidateInitialFieldsOnChange(object sender,
            TextChangedEventArgs e)
        {
            textBox3.IsEnabled = !string.IsNullOrWhiteSpace(textBox1.Text)
                && !string.IsNullOrWhiteSpace(textBox2.Text)
                ;
        }
    }
}

Было бы довольно тривиально адаптировать этот код в соответствии с вашим сценарием и не требовал бы ручной настройки фокуса. Вы, вероятно, могли бы вместо этого полагаться на порядок табуляции.

Но если порядок табуляции не помогает , вы все равно можете использовать комбинацию этих подходов для решения проблемы. Установите фокус в событии LostFocus и включите в событии TextChanged.

...