Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF Lostfocus未正确发射vs2010 treeviewitem_C#_Wpf_Focus_Treeviewitem - Fatal编程技术网

C# WPF Lostfocus未正确发射vs2010 treeviewitem

C# WPF Lostfocus未正确发射vs2010 treeviewitem,c#,wpf,focus,treeviewitem,C#,Wpf,Focus,Treeviewitem,我有一个嵌套的TreeView,我在其中绑定每个项目上的双击事件,以便将节点的文本更改为可编辑的文本框。然后,我使用lostFocus事件处理程序删除文本框并还原文本 void treeViewItemWithMenu_MouseDoubleClick(object sender, MouseButtonEventArgs e) { if (selected == e.Source) { TextBox tb = new Tex

我有一个嵌套的
TreeView
,我在其中绑定每个项目上的双击事件,以便将节点的文本更改为可编辑的文本框。然后,我使用lostFocus事件处理程序删除文本框并还原文本

  void treeViewItemWithMenu_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (selected == e.Source)
        {
            TextBox tb = new TextBox();
            tb.Text = this.Header.ToString();
            tb.Focus();
            tb.LostFocus += new RoutedEventHandler(tb_LostFocus);
            this.Header = tb;
            var a = e.OriginalSource;
            e.Handled = true;
        }
    }


    void tb_LostFocus(object sender, RoutedEventArgs e)
    {
        this.Header = ((TextBox)(this.Header)).Text;
    }
不幸的是,lostFocus事件似乎没有正常工作。当我在文本框外单击时,它根本不会启动。我甚至可以双击另一个节点,它进入编辑模式(即变成一个文本框),而第一个文本框似乎仍然有焦点。直到我开始在两个文本框之间来回切换,失去焦点才会触发


我正在使用VS2010RC,项目设置为.NET3.5

噢,天哪!请原谅我这么说,但是每一个读过你的问题的WPF普通用户可能都会同情地摇摇头。我们为您感到难过,因为您还没有学会真正的“WPF禅”,即利用数据绑定、模板和触发器使您的UI动态化,而不是采用老式方式。WPF之所以美丽是因为它的这种能力。它还使事情“1000%”变得更容易

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

至于您的LostFocus问题,我怀疑您的问题是您有多个焦点范围,或者它是RC中的一个bug。没有看到你的XAML,我不能说更多了

有关以“WPF方式”执行此操作的其他详细信息

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

模板可以是简单的,也可以是复杂的。这里有一个简单的例子:

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

<DataTemplate x:Key="TextBoxTemplate">
  <TextBox Text="{Binding}" />
</DataTemplate>
要将其切换回:

SetShowTextBox(item, false);

我希望这能有所帮助。

我认为iKeyboardFocuswithin不够好。当我点击外部时,我不认为我改变了键盘焦点。我想也许我需要在主窗口中捕捉mouseDown事件,然后如果目标不是我的文本框,则松开焦点。但这并不能处理像“tab”这样的键盘事件,所以我希望有一些“lostFocus”事件可以处理。顺便说一句:当使用具有内部父子关系的表时,数据绑定看起来更复杂,但我想要一个指向howto/tutorial的指针。我不熟悉教程中的内容,但在这种情况下,你必须几乎完全按照我说的做:非常简单。我将在答案中添加更多内容,以使细节更清楚。数据绑定到具有内部父子关系的表也不难:只需向数据模型(或视图模型)添加一个属性,该属性可以查找并返回子对象列表,并在
Hierarchy DataTemplate
ItemsSource
属性中绑定到该列表。
SetShowTextBox(item, true);
SetShowTextBox(item, false);