在我的WPF C#项目中,我创建了一个TreeView。每个TreeViewItem都有一个LostFocus事件,当项目失去焦点时必须引发该事件。
我还创建了一个按钮,当用户想要更改某个TreeViewItem的标题时,需要单击该按钮。
在TreeView中选择之后,用户可以单击按钮,然后出现一个TextBox替换TreeViewItem头。
如果用户未单击TextBox但单击另一个TreeViewItem,则永远不会引发LostFocus事件。否则,如果用户单击TextBox然后更改焦点,则会引发它。
我还使用了textBox.Focus()
和Keyboard.Focus(textBox)
,但是不行。
我该如何解决这个问题?
为了清楚起见,在创建帖子之前,我已经阅读了另一个SO答案here
以下是代码段
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) =>
{...}
}
答案 0 :(得分:3)
原谅我这么说,但是每个看过你问题的普通WPF用户都可能会动摇他们的头。我们为你感到难过,因为你还没有学到真正的WPF" Zen,它正在利用数据绑定,模板和触发器使你的UI变得动态而不是老式的方式。由于这种能力,WPF很漂亮。它也会使事情成为" 1000%"更容易。
我建议您更改UI以在TreeViewItem上使用Trigger,以根据您在TreeViewItem中定义的属性替换HeaderTemplate。双击该项时,将此属性设置为true。当IsKeyboardFocusWithin为false时将其设置为false(您可以覆盖元数据并为此添加PropertyChangedCallback)。
就你的LostFocus
问题而言,我怀疑你的问题是你有多个焦点范围。
执行此操作的其他详细信息" WPF方式"
以下是有关如何使用附加属性,触发器和模板实现此功能的一些详细信息。
您的模板可以根据需要简单或复杂。这很简单:
<DataTemplate x:Key="NormalTemplate">
<ContentPresenter />
</DataTemplate>
<DataTemplate x:Key="TextBoxTemplate">
<TextBox Text="{Binding}" />
</DataTemplate>
以下是您的风格:
附属物&#34; ShowTextBox&#34;可以使用&#34; propa&#34;在MyWindowClass中创建片段 - 只需输入&#34; propa&#34;然后点击标签,然后填写空白。
要切换项目以显示文本框,只需:
SetShowTextBox(item, true);
To switch it back:
SetShowTextBox(item, false);
请尝试学习并投资WPF
的模式和实践,以便轻松完成您想要达到的目标。
还有一些项目可以帮助您开始使用TreeViews实现的目标。