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);