在WPF应用程序中,我得到了一个包含多个Path对象的Canvas对象。我需要点击那些路径上的东西,即VM中的东西。路径上没有命令,例如Button。最好的方法是什么? 到目前为止我的解决方案是:
对我来说这似乎有点矫枉过正,你有什么看法?你看到更简洁的方法吗?
非常感谢!
答案 0 :(得分:1)
您可以Button
使用Path
作为Template
:
<Button Command="{Binding MyCommand}">
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<Path ... />
</ControlTemplate>
</Button.Template>
</Button>
答案 1 :(得分:0)
只是添加关于我上次评论的补充信息......定位ItemTemplate的正确方法是在ItemsControl.ItemContainerStyle中设置ContentPresenter的样式。您将在下面找到我最终正在使用的代码:
<UserControl.Resources>
<Style x:Key="PathStyle" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Path Data="{Binding Data}"
StrokeStartLineCap="Round"
Stretch="Fill"
StrokeEndLineCap="Round"
Stroke="{DynamicResource selectedZoneBorderColor}"
StrokeLineJoin="Round"
Width="{Binding Path=Width}"
Height="{Binding Path=Height}"
Fill="{DynamicResource selectedZoneColor}"
Panel.ZIndex="1"
StrokeThickness="3" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<ItemsControl Name="zonesContainer" ItemsSource="{Binding Zones}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Grid.Column="1" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button
Style="{StaticResource ResourceKey=PathStyle}"
Command="{Binding ElementName=zonesContainer,
Path=DataContext.ActivateZone}"
CommandParameter="{Binding Id}"
/>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding Path=Left}" />
<Setter Property="Canvas.Top" Value="{Binding Path=Top}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
所有这一切都有相应的VM暴露一个ObservableCollection,一个Zone类暴露所有内部道具(宽度,高度,顶部,左边......)。
您可以详细说明答案here