Wpf 如何在ContextMenu中将图标替换为矩形

Wpf 如何在ContextMenu中将图标替换为矩形,wpf,xaml,Wpf,Xaml,我需要将菜单项中的图标替换为矩形。目前我有: <TextBox.ContextMenu> <ContextMenu Focusable="False" ItemsSource="{Binding Categories}"> <ContextMenu.ItemContainerStyle> <Style TargetType="{x:Type MenuIt

我需要将菜单项中的图标替换为矩形。目前我有:

<TextBox.ContextMenu>
    <ContextMenu Focusable="False" ItemsSource="{Binding Categories}">                           
        <ContextMenu.ItemContainerStyle>
            <Style TargetType="{x:Type MenuItem}">
                <Setter Property="Header" Value="{Binding Name}"/>
                <Setter Property="Focusable" Value="False"/>         
            </Style>         
        </ContextMenu.ItemContainerStyle>
    </ContextMenu>
</TextBox.ContextMenu>

哪种方法很好:

但我不知道如何编辑MenuItem.图标并用矩形替换它

我已尝试使用数据模板:

<TextBox.ContextMenu>
    <ContextMenu Focusable="False" ItemsSource="{Binding Categories}">
        <ContextMenu.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" >
                    <Rectangle Width="20" Height="20" Fill="{Binding CategoryColor}"/>
                    <Label Content="{Binding Name}"/>
                </StackPanel>
            </DataTemplate>
        <ContextMenu.ItemTemplate>
     </ContextMenu>
</TextBox.ContextMenu>

虽然这看起来没问题,但最好是将矩形放入图标区域,或者完全删除图标区域。我还必须考虑将命令绑定到MenuItem,如果这对方法有影响的话

可能的解决办法: 我试过:

<TextBox.ContextMenu>
    <ContextMenu Focusable="False" ItemsSource="{Binding Categories}">
        <ContextMenu.Resources>
            <Rectangle x:Key="myRectangle" x:Shared="False" Width="20" Height="20" Fill="{Binding CategoryColor}"/>
        </ContextMenu.Resources>
        <ContextMenu.ItemContainerStyle>
            <Style TargetType="{x:Type MenuItem}">
                <Setter Property="Header" Value="{Binding Name}"/>
                <Setter Property="Focusable" Value="False"/>  
                <Setter Property="Icon" Value="{StaticResource myRectangle}"/>
            </Style>         
        </ContextMenu.ItemContainerStyle>
   </ContextMenu>
</TextBox.ContextMenu>

但这仅显示最后一个矩形:


我不得不处理类似的情况,在尝试覆盖默认样式并再次进行所有样式设置之后。。我意识到在你的矩形上留一个-ve的边距是最简单的方法

<StackPanel Orientation="Horizontal" Margin="-20,0,0,0">
        <Rectangle Width="20" Height="20" Fill="{Binding CategoryColor}"/>
         <Label Content="{Binding Name}"/>
</StackPanel>

第二个选项是在ResourceDictionary中定义一个矩形,将x:Shared设置为False:

<ResourceDictionary>
    <Rectangle x:Key="myRectangle" x:Shared="False" Width="20" Height="20" Fill="{Binding CategoryColor}" />
</ResourceDictionary>

…然后在您的风格中使用:

<TextBox>
    <TextBox.ContextMenu>
        <ContextMenu Focusable="False" ItemsSource="{Binding Categories}">
            <ContextMenu.ItemContainerStyle>
                <Style TargetType="{x:Type MenuItem}">
                    <Setter Property="Header" Value="{Binding Name}"/>
                    <Setter Property="Focusable" Value="False"/>
                    <Setter Property="Icon" Value="{StaticResource myRectangle}" />
                </Style>
            </ContextMenu.ItemContainerStyle>
        </ContextMenu>
    </TextBox.ContextMenu>
</TextBox>


谢谢!简单而有效。是的,它应该更整洁,更容易覆盖模板的图标,但它是如何现在!很高兴它有帮助!我尝试将矩形放在ContextMenu.Resources中,但它似乎只将颜色绑定到最后一个条目。知道为什么吗?我没试过!我确实知道,在将x:Shared标志放入ResourceDictionary时,它是至关重要的,否则资源就会被使用它的任何后续元素窃取,从而导致您所描述的内容。嗯。我刚刚测试了这个,当添加到ContextMenu.Resources时,它似乎在我的测试应用程序上表现得很好。您是否设置了x:Shared?是的,我设置了-我在答案中添加了代码-以及结果。谢谢我已将您的代码复制/粘贴到我的测试应用程序中,无法复制此行为。快速健全性检查:您在绑定对象中填充了颜色吗?是的,我填充了-上面的第二个代码示例使用了完全相同的ItemsSource。恐怕我没有选项了。我的测试应用程序有一个名为Categories的可观察集合。MyThing具有字符串属性名称和字符串属性CategoryColor。我用4个神话填充类别:{“Testing”,“Red”}/{“Testing2”,“Blue”}/{“Testing3”,“Orange”}/{“Testing4”,“Yellow”}。一切按预期进行。嗯。我使用的是画笔而不是字符串属性。这就是原因吗?啊哈!这与矩形上需要x:Shared的原因相同。如果未设置,它将尝试重用笔刷,这意味着它的每个后续用户都会“窃取”它。不幸的是,据我所知,谷歌没有办法通过编程来设置它:“WPF对象模型中没有与x:Shared等价的直接代码;只能在XAML用法“()”中指定它。