我有一个自定义画布(DesignerCanvas),用户可以添加一些控件到这个画布。在添加任何控件之前,画布首先将其包装到自定义控件(设计器项)中,然后将该控件添加到画布中。
WPF图设计器-
http://www.codeproject.com/KB/WPF/WPFDiagramDesigner_Part4.aspx
我为DesignerCanvas和DesignerItem添加了上下文菜单,它们都有一个名为“Lock”的菜单项。我还在canvas中添加了一个名为“IsLocked”的属性来锁定画布。
现在,在上下文菜单中,如果canvas被锁定,我想显示一个复选标记,为此,我将IsLocked属性绑定到MenuItem的IsChecked属性。问题是它适用于DesignerCanvas cantext菜单,但不适用于DesignerItems上下文菜单。
DesignerCanvas ContextMenu代码,这个很好用-
<!-- Context menu for DesignerCanvas -->
<ContextMenu x:Key="DesignerCanvasContextMenu">
<!-- Other menu items -->
<MenuItem IsCheckable="True" Header="Lock"
IsChecked="{Binding Path=IsLocked, Mode=TwoWay,
RelativeSource={RelativeSource AncestorType={x:Type locl:DesignerCanvas}}}"
Command="{x:Static local:DesignerCanvas.LockUnLock}"
CommandParameter="{Binding RelativeSource={RelativeSource Self},
Path=IsChecked}"
CommandTarget="{Binding Path=PlacementTarget,
RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}">
</MenuItem>
</ContextMenu>
也需要对DesignerItem菜单执行相同的行为。我试过这么做,但没用-
<!-- Context menu for DesignerItem -->
<ContextMenu x:Key="DesignerItemContextMenu">
<!-- Other menu items -->
<MenuItem IsCheckable="True" Header="Lock"
IsChecked="{Binding Path=Parent.IsLocked, Mode=TwoWay,
RelativeSource={RelativeSource AncestorType={x:Type locl:DesignerItem}}}"
Command="{x:Static local:DesignerCanvas.LockUnLock}"
CommandParameter="{Binding RelativeSource={RelativeSource Self},
Path=IsChecked}"
CommandTarget="{Binding Path=PlacementTarget,
RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}">
</MenuItem>
</ContextMenu>
我也尝试过使用PlacementTarget来实现这一点,但没有成功。由于DesignerItem是DesignerCanvas的孩子,因此获得DesignerCanvas及其财产应该不是不可能的。我做错什么了,知道吗?
更新:
我附上与设计师的画布和设计师这样的项目上下文菜单-
<!-- DesignerItem || Style -->
<Style TargetType="{x:Type locl:DesignerItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:DesignerItem}">
<Grid x:Name="PART_Grid" Cursor="SizeAll"
DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}
,Path=.}"
ContextMenu="{StaticResource DesignerItemContextMenu}">
<!-- other template parts -->
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- DesignerCanvas || Style -->
<Style
TargetType="{x:Type locl:DesignerCanvas}">
<Setter
Property="ContextMenu"
Value="{StaticResource DesignerCanvasContextMenu}" />
</Style>