2011-07-10 6 views
0

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

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

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); 
     } 
    } 
+0

Вы не можете сфокусировать отключенный элемент. Вам нужно будет включить его, а затем сосредоточьтесь на нем. Ваш вопрос, кажется, касается этого («условия удовлетворены должным образом»), но это немного расплывчато - какие условия? Если вы можете отделить то, что ожидаете, и то, что вы видите, может облегчить его. Я понимаю, что основная проблема заключается в том, что «если я включу элемент управления в обработчике LostFocus, он будет по-прежнему пропущен в порядке табуляции. Он будет учитываться только в порядке вкладок, когда он включен до табуляции». Правильно ли это звучит? –

+0

Мерлин, ваше описание моей проблемы невероятно кратки. Я думаю, что вопрос, который я действительно задаю, по сути, состоит в том, чтобы (сильно украсть ваше описание): если я включу элемент управления в обработчике LostFocus, тогда попытайтесь сфокусировать его, почему элемент, чья фокусировка вызвало событие LostFocus (в моем коде Field_One, который имеет вкладку для вызова обработчика LostFocus от Field_Two) сохраняет фокус, несмотря на вызов newEnabledElement.Focus() – humanstory

ответ

0

Вы можете попробовать включить/отключить в 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.

+0

Обратите внимание, что если вы еще не создали много кода, я бы предложите посмотреть [шаблон проектирования MVVM] (http://en.wikipedia.org/wiki/Model_View_ViewModel). Мой примерный код не использует его, потому что казалось, что у вашего вопроса уже много кода. –

 Смежные вопросы

  • Нет связанных вопросов^_^