ContextMenu wpf를 사용한 UserControl
Aug 21 2020
특정 텍스트와 이미지를 단추 컨텍스트에 전달할 수 있도록 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, 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>
그리고 내가보기에서 사용한 방법
<control:MenuControl ImageSource="Icons/TestPlan.png" Text="Load">
<StackPanel>
<MenuItem Header="test1" />
<MenuItem Header="test2" />
</StackPanel>
</control:MenuControl>
그러나 내 메뉴 항목은 단일 요소로 표시되었습니다.
또한 IEnumerable DependencyProperty를 지정하고 항목에 ContextMenu를 바인딩하려고 시도했지만 이것이 작동하지 않았습니다. 제발 무엇을 할 수 있습니까?
답변
1 mm8 Aug 21 2020 at 21:07
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, 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>
다음과 같이 설정하십시오.
<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>