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