- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个嵌套的 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/
C#: TreeViewItem treeItem = null; treeItem = new TreeViewItem(); treeItem.Header = "
我有 webservice asmx,还有类: Country public string Name {get;set;} public string Code {get;set;} public L
我有一个Silverlight树 View ,该树 View 动态填充有treeviewitems(代表 View )。我的工作正常,但是当我单击Treeviewitem时说“ View 2.01”时
我使用最新版本的 mvvm light 工具包,但是我不清楚如何将 EventToCommand 用于事件 TreeViewItem.Expanded。 这很有效......我做错了什么?
当 TreeView(或应用程序)失去焦点时,如何更改所选 TreeViewItem 的背景。在这种情况下,默认情况下选定的项目具有浅灰色背景。 编辑:第一个答案后的尝试:但是找不到带有 Target
我希望能够通过右键单击在我的程序中选择一个 TreeViewItem。以前,(在 this question 中)我试图通过从任何我想允许选择 TreeViewItem 的地方调用 SetSelect
我是 WPF 表单的新手,在尝试在 TreeViewItem 中设置背景时遇到了一个问题。
我被要求更新 WPF 应用程序中的 TreeVeiw,该应用程序是从类对象动态构建的。正如您将看到的,treeveiw 不受任何约束。以下不是我的代码!! private void Buil
目前这是我的控件: 它应该在 ListBox 中,但问题是我需要能够仅选择父项或子项。 这是一个简单的概念,但我已经尝试了很多(包装在 ListBoxItem 中。使用扩展器并手动更改可
我希望能够从 TreeViewItem 中删除子节点通过按键盘上的删除按钮。我正在使用 SelectedItem尝试这样做。 目前我正在使用 KeyDown我的代码隐藏中的事件: private vo
private void SetCurrentItemInEditMode(bool EditMode) { if (product_tree.SelectedItem is Tre
你好,我正在使用一个 WPF 应用程序,我希望在展开 TreeView 上的项目之前触发事件。我知道目前还没有为此举办的事件,但我不确定如何以我这样做的方式添加一个事件,因此我们将不胜感激。 这是 x
我有一个 TreeView,我从一个集合中填充了一个 TreeViewItem 列表(使用绑定(bind)),我链接到一个 TreeView 事件“展开”以展开它并显示他们的 child ,我现在的目
您好问题是我有多个 TreeView 控件,每个 TreeView 都有自己的 TreeViewItem 样式,设置它 TreeView ItemContainerStyle="{StaticReso
我正在尝试创建一个向右水平扩展的 TreeView ,以便它像这样扩展: Parent1 -> Child1 Child2 Child3
为了在 TreeViewItem 中存储一个对象(比如一个类的实例),我目前将该对象存储在 TreeViewItem 中。的 Header然后覆盖 ToString该类的方法,以便它显示正确的字符串标
在我的 MVVM 应用程序中,我有一个树 View ,应该在选择时将树 View 项带入 View 。树 View 表示数据库中的记录。每个树 View 项通过在选择时展开项来按需加载其子项。 树 V
我有一个典型的 TreeView 和一个 View 模型。 View 模型有一个可观察的其他 View 模型集合,用作树的数据源。 public class TreeViewVM { publ
我有一个 TreeView我正在尝试实现一种样式,允许我使用 HierarchicalDataTemplate 在特定节点的所有子节点周围放置边框.我想要的一个例子如下所示: 以下代码是我到目前为止所
我在 TreeView 中有一个 TreeView 项目,它将绑定(bind)一个列表:
我是一名优秀的程序员,十分优秀!