在我的WPF C#项目中,我创建了一个TreeView。每个TreeViewItem都有一个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) =>
{...}
}发布于 2014-04-11 16:51:14
我建议您更改UI以使用TreeViewItem上的触发器来根据在TreeViewItem中定义的属性替换TreeViewItem。双击项时将此属性设置为true。当IsKeyboardFocusWithin变为false时,将其设置为false (您可以覆盖元数据并为此添加一个PropertyChangedCallback )。
就您的LostFocus问题而言,我怀疑您的问题是有多个焦点范围。
有关以"WPF方式“进行此操作的详细信息
以下是关于如何使用附加属性、触发器和模板来实现此操作的一些详细信息。
模板可以是简单的,也可以是您想要的复杂的。这里很简单:
<DataTemplate x:Key="NormalTemplate">
<ContentPresenter />
</DataTemplate>
<DataTemplate x:Key="TextBoxTemplate">
<TextBox Text="{Binding}" />
</DataTemplate>以下是您的风格:
附加属性"ShowTextBox“可以使用"propa”片段在MyWindowClass中创建--只需键入"propa“并点击选项卡,然后填充空格。
要切换项目以显示文本框,只需:
SetShowTextBox(item, true);
To switch it back:
SetShowTextBox(item, false);请尝试学习和投资于WPF的模式和实践,这样你就可以很容易地完成你想要达到的目标。
还有一些项目可以帮助您开始使用TreeViews来实现您想要实现的目标。
样本工程
https://stackoverflow.com/questions/23017890
复制相似问题