ContextMenu wpf ile UserControl
Belirli bir metni ve resmi düğme bağlamına geçirme yeteneğine sahip olmak için ContextMenu ile düğme UserControl oluşturmaya çalışıyorum. Ancak ContextMenu öğelerini nasıl düzgün bağlayacağınızı ve bunları xaml veya bağlama yoluyla nasıl belirleyeceğimi bilmiyorum.
ContextMenu bloğu içindeki ContentPresenter ile böyle bir kontrol belirtmeye çalıştım.
<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, RelativeSource={RelativeSource Mode=FindAncestor, 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>
Ve bakışta nasıl kullandım
<control:MenuControl ImageSource="Icons/TestPlan.png" Text="Load">
<StackPanel>
<MenuItem Header="test1" />
<MenuItem Header="test2" />
</StackPanel>
</control:MenuControl>
Ancak menü öğelerim tek bir öğe olarak gösterildi.
Ayrıca, IEnumerable DependencyProperty'yi belirlemeye ve ContextMenu'yu öğelere bağlamaya çalıştım, ancak bu benim için çalışmadı. Ne yapabilirim lütfen
Yanıtlar
UserControlÇalışmalara bir List salt okunur özelliği ekleme :
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); }
}
...
}
Şu konumdaki mülke bağlayın 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, RelativeSource={RelativeSource Mode=FindAncestor, 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>
Ve bunu şu şekilde ayarlayın:
<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>