2

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

不幸的是,lostFocus 事件似乎没有正常工作。当我在文本框外单击时,它根本不会触发。我什至可以双击另一个节点,它进入编辑模式(即变成一个文本框),而第一个文本框似乎仍然有焦点。在我开始在两个文本框之间来回切换之前,失去焦点不会触发。

我正在使用项目设置为 .net 3.5 的 vs2010 rc。

4

1 回答 1

1

天啊!请原谅我这么说,但每一个读过你的问题的普通 WPF 用户都可能同情地摇头。我们为您感到难过,因为您还没有学习真正的“WPF 之禅”,它利用数据绑定、模板和触发器来使您的 UI 动态化,而不是以老式的方式进行。由于这种能力,WPF 很漂亮。它还使事情“1000%”更容易。

我建议您更改 UI 以在 TreeViewItem 上使用触发器来根据您在 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);

我希望这有帮助。

于 2010-02-17T02:29:18.077 回答