WPF IsEnabled 和 IsHitTestVisible

Posted

技术标签:

【中文标题】WPF IsEnabled 和 IsHitTestVisible【英文标题】:WPF IsEnabled and IsHitTestVisible 【发布时间】:2014-04-04 13:28:31 【问题描述】:

我尝试将 treeView 中的元素设置为 "IsEnabled" = false 但我希望用户可以选择该项目。 这可能吗?

背景: 用户可以取消删除项目(IsEnabled = false),但他也可以取消删除项目,但因此他必须选择项目但“IsEnabled”= false 它不起作用。

解决方法:将“已删除”项目的颜色设置为另一种颜色。 问题:子项没有改变颜色,用户可以打开“已删除”的根节点

例子:

括号 文档 工作表

全部启用

现在我删除文档

括号 (del)文件 工作表

如果 (del)Document 的“IsEnabled”为 false,则用户无法选择要取消删除的文档。 通过 (del)Document 的颜色更改,工作表不会更改颜色。

我在我的项目中使用 MVVM 模式。

【问题讨论】:

为什么不使用解决方法并设置子元素颜色? IMO 您的“解决方法”是比禁用项目更好的做法 【参考方案1】:

鉴于您的一般性问题,我认为最简单的解决方案是按照您说的那样做,并为 TreeView 项目添加递归 ChangeColor()。

此方法应遍历其子级并对其子级调用 ChangeColor()。

【讨论】:

抱歉,我没有告诉我将 HierarchicalDataTemplate 与 DataBinding 一起使用,所以我认为很难获取元素的子元素或? 这使它变得更加容易。您的每个项目的视图模型应该有一个可观察的集合,以便 HierarchicalDataTemplate.ItemSource 可以绑定到它。对吗? 不,集合在模型中。所以我不能在那里设置任何东西。我找到了一种解决方法:我为元素设置了另一种颜色并阻止用户展开此节点,这样他就看不到已删除对象下的对象,我也不必更改子项的颜色 :) 谢谢你帮助!【参考方案2】:

我尝试将 treeView 中的元素设置为 "IsEnabled" = false 但我希望用户可以选择该项目。这可能吗?

不,这是不可能的。来自UIElement.IsEnabled Documentation:

未启用的元素不参与命中测试或焦点,因此不会成为输入事件的来源。

这意味着禁用的元素无法获得鼠标按下/单击事件,因此无法选择。

我认为您的解决方法是正确的。您可以在视图模型中表示“已删除”状态,并根据此状态更新元素的颜色。

【讨论】:

以上是关于WPF IsEnabled 和 IsHitTestVisible的主要内容,如果未能解决你的问题,请参考以下文章

WPF 网格与孩子。如何将子 IsEnabled 绑定到父行

WPF DatePicker IsEnabled 属性不改变外观

WPF 条件绑定。 Button.IsEnabled 到 SelectedIndex >= 0

C# WPF IsEnabled 使用多个绑定?

WPF XAML 在 IsEnabled 状态下更改图像不透明度

仅在网格(WPF)中为一行添加IsEnabled