没有为TreeViewItem引发LostFocus

时间:2014-04-11 16:26:25

标签: c# wpf textbox lostfocus

在我的WPF C#项目中,我创建了一个TreeView。每个TreeViewItem都有一个LostFocus事件,当项目失去焦点时必须引发该事件。 我还创建了一个按钮,当用户想要更改某个TreeViewItem的标题时,需要单击该按钮。 在TreeView中选择之后,用户可以单击按钮,然后出现一个TextBox替换TreeViewItem头。 如果用户未单击TextBox但单击另一个TreeViewItem,则永远不会引发LostFocus事件。否则,如果用户单击TextBox然后更改焦点,则会引发它。 我还使用了textBox.Focus()Keyboard.Focus(textBox),但是不行。 我该如何解决这个问题?

为了清楚起见,在创建帖子之前,我已经阅读了另一个SO答案here

以下是代码段

 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) =>
                     {...}  
    }

1 个答案:

答案 0 :(得分:3)

原谅我这么说,但是每个看过你问题的普通WPF用户都可能会动摇他们的头。我们为你感到难过,因为你还没有学到真正的WPF" Zen,它正在利用数据绑定,模板和触发器使你的UI变得动态而不是老式的方式。由于这种能力,WPF很漂亮。它也会使事情成为" 1000%"更容易。

我建议您更改UI以在TreeViewItem上使用Trigger,以根据您在TreeViewItem中定义的属性替换HeaderTemplate。双击该项时,将此属性设置为true。当IsKeyboardFocusWithin为false时将其设置为false(您可以覆盖元数据并为此添加PropertyChangedCallback)。

就你的LostFocus问题而言,我怀疑你的问题是你有多个焦点范围。

执行此操作的其他详细信息" WPF方式"

以下是有关如何使用附加属性,触发器和模板实现此功能的一些详细信息。

您的模板可以根据需要简单或复杂。这很简单:

<DataTemplate x:Key="NormalTemplate">
  <ContentPresenter />
</DataTemplate>

<DataTemplate x:Key="TextBoxTemplate">
  <TextBox Text="{Binding}" />
</DataTemplate>

以下是您的风格:

              附属物&#34; ShowTextBox&#34;可以使用&#34; propa&#34;在MyWindowClass中创建片段 - 只需输入&#34; propa&#34;然后点击标签,然后填写空白。

要切换项目以显示文本框,只需:

SetShowTextBox(item, true);
To switch it back:

SetShowTextBox(item, false);

请尝试学习并投资WPF的模式和实践,以便轻松完成您想要达到的目标。

还有一些项目可以帮助您开始使用TreeViews实现的目标。

Sample project