Вопрос

В моем проекте 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.

Пример проекта

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top