LostFocus не создается для TreeViewItem
Вопрос
В моем проекте WPF C# я создал TreeView.Каждый TreeViewItem имеет событие LostFocus, которое должно быть вызвано, когда элемент потерял фокус.Я также создал кнопку, которую нужно нажимать, когда пользователь хочет изменить заголовок определенного TreeViewItem.Пользователь, после выбора в TreeView, может нажать кнопку, и появится текстовое поле, заменяющее заголовок TreeViewItem.Если пользователь не нажимает TextBox, а нажимает другой TreeViewItem, событие LostFocus никогда не возникает.В противном случае, если пользователь щелкнет по TextBox, а затем изменит фокус, оно будет поднято.Я также использовал textBox.Focus()
и Keyboard.Focus(textBox)
но они не работают.Как я могу это исправить?
Чтобы внести ясность: прежде чем создавать сообщение, я прочитал еще один ответ ТАК. здесь
Вот фрагмент кода
private void RenameButton_Click(object sender, RoutedEventArgs e)
{
TreeViewItem twItemSelected = (TreeViewItem)this.Treeview_PropertyDefinition.SelectedItem;
var textBox = new TextBox()
{
Text = (String)twItemSelected.Header,
};
textBox.Focus();
Keyboard.Focus(textBox);
if (textBox.IsFocused)
MessageBox.Show("focused");
twItemSelected.Header = textBox;
//check which property is currently selected
String parentName = ((TreeViewItem)twItemSelected.Parent).Name;
((TreeViewItem)twItemSelected.Parent).Parent).Name;
//get values from file
//show page based on parent value
switch (parentName)
{
case "RectangleBar_TreeviewItem":
textBox.LostFocus += (o, ev) =>
{...}
}
Решение
Простите за такие слова, но каждый постоянный пользователь WPF, прочитавший ваш вопрос, вероятно, с сожалением покачал головой.Нам грустно за вас, потому что вы еще не изучили настоящий «Дзен WPF», который использует привязку данных, шаблоны и триггеры, чтобы сделать ваш пользовательский интерфейс динамичным, а не делать это старомодным способом.WPF прекрасен именно благодаря этой способности.Это также упрощает задачу на 1000%.
Я рекомендую вам изменить свой пользовательский интерфейс, чтобы использовать триггер в TreeViewItem для замены шаблона HeaderTemplate на основе свойства, которое вы определяете в TreeViewItem.Установите для этого свойства значение true при двойном щелчке элемента.Установите значение false, когда IsKeyboardFocusWithin становится ложным (вы можете переопределить метаданные и добавить для этого PropertyChangedCallback).
Насколько ваш LostFocus
Проблема в том, что я подозреваю, что ваша проблема в том, что у вас несколько прицелов фокусировки.
Дополнительные сведения о том, как это сделать «способом WPF»
Вот некоторые подробности о том, как реализовать это с помощью прикрепленного свойства, триггеров и шаблонов.
Ваши шаблоны могут быть настолько простыми или сложными, насколько вы захотите.Вот просто:
<DataTemplate x:Key="NormalTemplate">
<ContentPresenter />
</DataTemplate>
<DataTemplate x:Key="TextBoxTemplate">
<TextBox Text="{Binding}" />
</DataTemplate>
Вот как будет выглядеть ваш стиль:
Прикрепленное свойство «ShowTextBox» можно создать в MyWindowClass с помощью фрагмента «propa» — просто введите «propa» и нажмите Tab, а затем заполните пробелы.
Чтобы переключить элемент на отображение текстового поля, просто:
SetShowTextBox(item, true);
To switch it back:
SetShowTextBox(item, false);
Пожалуйста, попробуйте изучить и инвестировать в модели и практики WPF
так что вам будет легко сделать то, чего вы хотите достичь.
Существуют также проекты, которые могут помочь вам начать работу над тем, чего вы хотите достичь с помощью TreeViews.