我在我的双击事件结合在每个项目上,使得节点的文本被改变成一个可编辑文本框的嵌套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;
    }

Unfortantly它似乎并不像LostFocus事件是否正常工作。当我点击文本框外,它不火的。我甚至可以双击另一个节点上,并进入编辑模式(即变成一个文本框),而第一个文本框似乎依然具有焦点。失去焦点不火,直到我开始来回两个文本框之间。

我使用VS2010 RC与项目设置为.NET 3.5。

有帮助吗?

解决方案

哦,我的!原谅我这么说,但谁也读了你的问题每一个正WPF用户可能已经动摇他们的怜悯头。我们感到悲伤你,因为你还没有学会真正的“WPF的禅”,这是利用数据绑定,模板和触发器,使您的UI动态的而不是做老式的方式。 WPF是因为这种能力美丽。这也使得东西 “1000%” 更容易。

我建议你改变你的UI使用触发器在你的树型视图根据您在树型视图定义属性来代替你的HeaderTemplate中。当该项目是双击设置该属性正确的。将它设置假时IsKeyboardFocusWithin为假(你可以忽略元数据并添加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>

附加属性“ShowTextBox”可以在MyWindowClass使用“propa”片段来创建 - 只需键入“propa”和命中标签,然后填补空白

要切换项来显示文本框,只是:

SetShowTextBox(item, true);

要切换回:

SetShowTextBox(item, false);

我希望这有助于。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top