WPF Lostfocus没有正确射击vs2010 treeviewitem

时间:2010-02-16 14:55:40

标签: c# wpf focus treeviewitem

我有一个嵌套的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。

1 个答案:

答案 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);

我希望这会有所帮助。