在我的wpf c#项目中,我创建了一个树视图。每个树查看都有一个Lostfocus事件,必须在物品失去焦点时提出。 当用户想要更改某个TreeViewItem的标题时,我还创建了要单击的按钮。 用户在TreeView中的选择之后,可以单击按钮,显示TextBox替换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 ZEN”,它正在利用数据绑定,模板和触发器来使你的UI动态而不是做旧式的方式。由于这种能力,WPF很漂亮。它还使东西“1000%”更容易。

我建议您更改您的UI以在TreeViewitem上使用触发器,以基于您在TreeViewitem中定义的属性来替换您的Headertemplate。在双击该项目时将此属性设置为true。当ISKeyboardFocusWithin为false时将其设置为false(您可以覆盖元数据并为此添加propertyChangedCallback)。

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

有关执行此操作的其他详细信息,请执行“WPF Way”

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

您的模板可以像你想要的那样简单或复杂。这是简单的:

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

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

这是你的风格看起来像的样子:

附加的属性“showtextbox”可以使用“propa”片段 - 只需键入“propa”和命中选项卡,然后填写空白。

要切换项目以显示TextBox,仅限:

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

SetShowTextBox(item, false);
.

请尝试学习和投资生成的模式和实践,以便可以轻松完成您想要实现的目标。

还有一个项目可以帮助您使用TreeViews实现您想要实现的内容。

示例项目

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top