2016-10-24 2 views
0

У меня есть две разные команды; каждый из которых выполняет некоторые действия и раскрывает форму. Я хочу, чтобы они установили фокус на первое текстовое поле в этой форме, когда они установили свойство Visible на true.Настройка фокуса на текстовое поле при выполнении метода

Я видел всевозможные SO-статьи на эту тему, но я просто не могу разгадать кусочки вместе. Я работаю с MVVM, но все MVVM-решения выглядят довольно обширными для чего-то, что является просто улучшением QoL. У меня есть код в моем файле codebehind, поэтому я предположил, что могу просто положить его туда и получить более быстрое/более чистое решение, но те, которые я мог бы найти в основном для фокуса.

Я столкнулся с Focusmanager, но это, похоже, не приводит меня никуда.

Трудная часть всей конструкции следующая:

<ListBox Grid.Column="0" Grid.Row="1" Margin="5" IsEnabled="{Binding IsEnabled}" ItemsSource="{Binding DisabledConfigs}" SelectionMode="Extended" SelectedItem="{Binding SelectedConfig}"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <cmd:EventToCommand Command="{Binding SelectionChanged}"/> 
     </i:EventTrigger> 
     <i:EventTrigger EventName="MouseDoubleClick"> 
      <cmd:EventToCommand Command="{Binding EditConfig}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ListBox> 

The EditConfig -command вызывает метод, который проверяет некоторые свойства двойного щелчка объекта, и либо показывает форму или нет. Когда это произойдет, первое текстовое поле в этой форме должно получить фокус, иначе ничего важного не произойдет.

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

Edit: После предложению AdminSoftDK я попытался следующие

// Auto-generated 
private void nameBoxEdit_IsVisibleChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e) 
{ 
    if (nameBoxEdit.IsVisible) 
    { 
     // nameBoxEdit is (quite self-explanatory) the textbox that I want to focus on 
     nameBoxEdit.Focus(); 
    } 
} 

Я убежден, что это должно быть очень близко к решению, но он не работает, как есть.

+0

Почему решение «сфокусировать первый элемент пользовательского интерфейса по порядку вкладок при отображении окна» соответствует вашим потребностям? – dymanoid

+0

@dymanoid, потому что это не окно, которое отображается, но групповой ящик, для которого свойство «Видимый» установлено в false. Только когда он установлен в true (двойным щелчком другого элемента пользовательского интерфейса), он показывает и должен получать фокус. – Ciphra

+0

Положите логику управления фокусом в View (* грязный * MVVM). ViewModel может предоставить все необходимое: событие, его фокус может быть изменен командой, свойствами, если вам нужно абстрагироваться, из какого элемента управления следует получить фокус и т. Д. – Sinatr

ответ

1

Огромный Shoutout в adminSoftDK за помощь мне здесь

Так что я, наконец, получил решение, которое выглядит довольно странно для меня, но это работает, так что я не жалуюсь;

private void nameBoxAdd_IsVisibleChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e) 
    { 
     if(!nameBoxAdd.IsVisible) 
     { 
      nameBoxAdd.UpdateLayout(); 
      // Task.Delay(500); abundant 
      nameBoxAdd.Focus(); 
      // After testing some more, the Task.Delay(500) is not needed either. 
      // It's just the combination of UpdateLayout() and Focus() 
     } 
    } 

У меня был довольно exstensive список методов-вызовов и имущества проверок в здесь, чтобы увидеть, если что-либо работал, и минимумам, и вот фокус был предоставлен. Я начал фильтровать вниз, и по какой-то причине объединенное усилие UpdateLatyout() и отложенная задача на Focus() заставило его работать. Не из-за них (я пробовал иметь только тот или другой, который оба меня снова поставил на нефокус), но оба они.

Еще одно странное замечание заключается в том, что событие IsVisibleChanged вызывает до, фактически меняя объект. Что-то, с чем я столкнулся с отладчиком.

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