WPF引发LostFocus不触发正确VS2010树型视图
-
20-09-2019 - |
题
我在我的双击事件结合在每个项目上,使得节点的文本被改变成一个可编辑文本框的嵌套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;
}
Unfortantly它似乎并不像LostFocus事件是否正常工作。当我点击文本框外,它不火的。我甚至可以双击另一个节点上,并进入编辑模式(即变成一个文本框),而第一个文本框似乎依然具有焦点。失去焦点不火,直到我开始来回两个文本框之间。
我使用VS2010 RC与项目设置为.NET 3.5。
解决方案
哦,我的!原谅我这么说,但谁也读了你的问题每一个正WPF用户可能已经动摇他们的怜悯头。我们感到悲伤你,因为你还没有学会真正的“WPF的禅”,这是利用数据绑定,模板和触发器,使您的UI动态的而不是做老式的方式。 WPF是因为这种能力美丽。这也使得东西 “1000%” 更容易。
我建议你改变你的UI使用触发器在你的树型视图根据您在树型视图定义属性来代替你的HeaderTemplate中。当该项目是双击设置该属性正确的。将它设置假时IsKeyboardFocusWithin为假(你可以忽略元数据并添加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>
附加属性“ShowTextBox”可以在MyWindowClass使用“propa”片段来创建 - 只需键入“propa”和命中标签,然后填补空白
要切换项来显示文本框,只是:
SetShowTextBox(item, true);
要切换回:
SetShowTextBox(item, false);
我希望这有助于。