c# - WPF Lostfocus 无法正确触发 vs2010 treeviewitem

标签 c# wpf focus treeviewitem

我有一个嵌套的 TreeView,我在其中绑定(bind)了每个项目的双击事件,以便将节点的文本更改为可编辑的文本框。然后我使用 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。

最佳答案

我的天啊!请原谅我这么说,但每个阅读过您的问题的普通 WPF 用户可能都会遗憾地摇头。我们为您感到难过,因为您还没有学习真正的“WPF 之禅”,即利用数据绑定(bind)、模板和触发器使您的 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”并点击 Tab,然后填写空白。

要切换项目以显示文本框,只需:

SetShowTextBox(item, true);

要切换回来:

SetShowTextBox(item, false);

希望对您有所帮助。

关于c# - WPF Lostfocus 无法正确触发 vs2010 treeviewitem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2273734/

相关文章:

时间:2019-03-08 标签:c#htmlagilitypack

c# - 如果以前的记录在 ItemsSource 集合中没有匹配项,则 WPF ComboBox 绑定(bind)有效,如果有则失败

c# - 在 Windows 7 WPF 客户端上发布异步抛出 System.Net.WebException

android - 当具有可选文本的 TextView 成为焦点时,停止 ScrollView 滚动

jquery - 强制聚焦于一个元素,但有异常(exception)。 (jQuery)

c# - 快速信息不显示某些项目可能存在的异常

c# - 如何在 MVC 4 的代码优先方法中将 Membership 的用户表中的外键创建到自定义表中?

c# - 以编程方式设置打印机功能

c# - 当其 DataContext 更改时,具有数据模板化 ContentControl 的 UserControl 会引发绑定(bind)错误

javascript - 焦点位于输入字段