【发布时间】:2014-09-16 15:16:47
【问题描述】:
我对 WPF 还有些陌生,所以如果我遗漏了一两个明显的概念,我深表歉意。
我正在使用遵循 MVVM 范例的 WPF。我真正的问题有点复杂,所以我会尽量简化。假设我在画布上有一些(实际上是很多)路径:
<Canvas x:Name="Canvas1" Width="600" Height="300">
<Path x:Name="Path1" Style="{StaticResource PathStyle}" .../>
<Path x:Name="Path2" Style="{StaticResource PathStyle}" .../>
<Path x:Name="Path3" Style="{StaticResource PathStyle}" .../>
/>
我使用的那种样式包含一些绑定,使所有路径保持相同的颜色,如下所示:
<Style x:Key="PathStyle" TargetType="Path">
<Setter Property="Fill" Value="{Binding FillColor, Converter={StaticResource BrushConverter}}"/>
<Setter Property="Stroke" Value="{Binding StrokeColor, Converter={StaticResource BrushConverter}}"/>
</Style>
当用户点击其中一条路径时,我可以捕捉到。当他们这样做时,我想“覆盖”绑定并更改所述路径的颜色,直到用户单击另一个。当他们单击它时,我可以手动设置Path.Stroke,但我不知道在清除SelectedPath 后如何“重新激活”绑定(因此路径保持我设置的任何颜色)。我尝试获取绑定表达式以强制刷新,但返回结果为 null (selectedPath.GetBindingExpression(Path.StrokeProperty))。
TL;DR:我想让它在用户单击路径时变为蓝色。当单击另一条路径时,我希望它根据样式中的绑定返回到 假定 的任何颜色。
有什么想法吗?感谢您抽出宝贵时间!
编辑:感谢您的中肯建议-如果我可以再推一点,如果有嵌套画布怎么办,但我仍然只想选择一个路径?如:
<Canvas x:Name="Canvas_Main" Width="600" Height="300">
<Canvas x:Name="Canvas1" Width="600" Height="300">
<Path x:Name="Path1" Style="{StaticResource PathStyle}" .../>
<Path x:Name="Path2" Style="{StaticResource PathStyle}" .../>
<Path x:Name="Path3" Style="{StaticResource PathStyle}" .../>
/>
<Canvas x:Name="Canvas1" Width="600" Height="300">
<Path x:Name="Path1" Style="{StaticResource PathStyle}" .../>
<Path x:Name="Path2" Style="{StaticResource PathStyle}" .../>
<Path x:Name="Path3" Style="{StaticResource PathStyle}" .../>
/>
/>
【问题讨论】:
-
只是一个美容建议:如果您在自己的风格中使用
TargetType="Path",则无需使用x:Key -
@Natxo 这不仅仅是外观上的改变,它会改变应用样式的元素,所以你应该更加小心。
-
@NovitchiS 你是对的,样式将应用于定义
Resources样式的元素内的所有Path元素。这就是我认为他想做的事情。 -
您可能可以使用
TreeView进行嵌套,但是Canvases不再是其父级Canvases的直接子级。如果您正在使用画布放置属性,则需要将它们绑定到ItemContainerStyle,因为项目容器将是画布的直接子项/或者如果您有静态项目,则可以将它们设置在手动创建的TreeViewItems上。跨度>