问题描述
我正在尝试使用ContextMenu创建按钮UserControl,以便能够将特定的文本和图像传递给按钮上下文。但是我不知道如何正确绑定ContextMenu项并通过xaml或绑定指定它们。
我试图用ContextMenu块中的ContentPresenter指定这样的控件。
<UserControl.Template>
<ControlTemplate targettype="UserControl">
<Button Style="{StaticResource HeaderButton}" app:ContextMenuLeftClickBehavior.IsLeftClickEnabled="True">
<Button.Content>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding ImageSource,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type local:MenuControl}}}" />
<TextBlock Text="{Binding Text,AncestorType={x:Type local:MenuControl}}}" />
<Path stroke="Black"
strokeThickness="1"
Margin="5 0 5 0"
Data="M 0 4 L 5 10 M 5 10 L 10 4" />
</StackPanel>
</Button.Content>
<Button.ContextMenu>
<ContextMenu>
<ContentPresenter />
</ContextMenu>
</Button.ContextMenu>
</Button>
</ControlTemplate>
</UserControl.Template>
以及我如何在视图中使用
<control:MenuControl ImageSource="Icons/TestPlan.png" Text="Load">
<StackPanel>
<MenuItem Header="test1" />
<MenuItem Header="test2" />
</StackPanel>
</control:MenuControl>
此外,我尝试指定IEnumerable DependencyProperty并将ContextMenu绑定到项目上,但这对我不起作用。我该怎么办?
解决方法
将列表只读属性添加到UserControl
的工作原理是
public partial class MenuControl : UserControl
{
public MenuControl()
{
InitializeComponent();
SetValue(ItemsPropertyKey,new List<MenuItem>());
}
private static readonly DependencyPropertyKey ItemsPropertyKey = DependencyProperty.RegisterReadOnly(
nameof(Items),typeof(List<MenuItem>),typeof(MenuControl),new FrameworkPropertyMetadata(null)
);
public static readonly DependencyProperty ItemsProperty = ItemsPropertyKey.DependencyProperty;
public List<MenuItem> Items
{
get { return (List<MenuItem>)GetValue(ItemsProperty); }
}
...
}
绑定到ControlTemplate
中的属性:
<ControlTemplate TargetType="UserControl">
<Button>
<Button.Content>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding ImageSource,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type local:MenuControl}}}" />
<TextBlock Text="{Binding Text,AncestorType={x:Type local:MenuControl}}}" />
<Path Stroke="Black"
StrokeThickness="1"
Margin="5 0 5 0"
Data="M 0 4 L 5 10 M 5 10 L 10 4" />
</StackPanel>
</Button.Content>
<Button.Tag>
<Binding RelativeSource="{RelativeSource AncestorType={x:Type local:MenuControl}}" />
</Button.Tag>
<Button.ContextMenu>
<ContextMenu ItemsSource="{Binding PlacementTarget.Tag.Items,RelativeSource={RelativeSource Self}}" />
</Button.ContextMenu>
</Button>
</ControlTemplate>
并这样设置:
<control:MenuControl x:Name="cc" ImageSource="Icons/TestPlan.png" Text="Load">
<control:MenuControl.Items>
<MenuItem Header="test1" />
<MenuItem Header="test2" />
</control:MenuControl.Items>
</control:MenuControl>