ContextMenu wpf के साथ UserControl

Aug 21 2020

मैं बटन संदर्भ के लिए विशिष्ट पाठ और छवि पारित करने की क्षमता रखने के लिए ContextMenu के साथ बटन UserControl बनाने की कोशिश कर रहा हूं। लेकिन मुझे नहीं पता कि कॉन्टेक्स्टमेनू आइटम को ठीक से कैसे बांधें और उन्हें 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>