我有一个嵌套的TreeView
,我在每个项目上绑定doubleclick事件,以便将节点的文本更改为可编辑的文本框。然后我使用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事件无法正常工作。当我在文本框外面单击时,它根本不会触发。我甚至可以双击另一个节点,它进入编辑模式(即成为一个文本框),而第一个文本框似乎仍然有焦点。丢失的焦点不会触发,直到我开始在两个文本框之间来回移动。
我正在使用vs2010 rc,项目设置为.net 3.5。
答案 0 :(得分:2)
哦,我的!原谅我这么说,但是每个看过你问题的普通WPF用户都可能会动摇他们的头。我们为您感到难过,因为您尚未学习真正的“WPF之禅”,它利用数据绑定,模板和触发器来使您的UI动态而不是以老式的方式进行。由于这种能力,WPF很漂亮。它还使“1000%”更容易。
我建议您更改UI以在TreeViewItem上使用Trigger,以根据您在TreeViewItem中定义的属性替换HeaderTemplate。双击该项时,将此属性设置为true。当IsKeyboardFocusWithin为false时将其设置为false(您可以覆盖元数据并为此添加PropertyChangedCallback)。
就你的LostFocus问题而言,我怀疑你的问题是你有多个焦点范围,或者它是RC中的一个错误。没有看到你的XAML,我不能说更多。
有关“WPF方式”的其他详细信息
以下是有关如何使用附加属性,触发器和模板实现此功能的一些详细信息。
您的模板可以根据需要简单或复杂。这很简单:
<DataTemplate x:Key="NormalTemplate">
<ContentPresenter />
</DataTemplate>
<DataTemplate x:Key="TextBoxTemplate">
<TextBox Text="{Binding}" />
</DataTemplate>
以下是您的风格:
<Style TargetType="TreeViewItem">
<Setter Property="HeaderTemplate" Value="{StaticResource NormalTemplate}" />
<Trigger Property="local:MyWindowClass.ShowTextBox" Value="true">
<Setter Property="HeaderTemplate" Value="{StaticResource TextBoxTemplate}" />
</Trigger>
</Style>
可以使用“propa”片段在MyWindowClass中创建附加属性“ShowTextBox” - 只需键入“propa”并点击标签,然后填写空白。
要切换项目以显示文本框,只需:
SetShowTextBox(item, true);
要将其切换回来:
SetShowTextBox(item, false);
我希望这会有所帮助。