Lostfocus没有为TreeViewitem提出
题
在我的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实现您想要实现的内容。