Wpf 使用图标绑定的菜单和子菜单

Wpf 使用图标绑定的菜单和子菜单,wpf,binding,menu,menuitem,ico,Wpf,Binding,Menu,Menuitem,Ico,我使用解决方案来绑定我的菜单,就像在本例中一样,我想知道如何将图标添加到我的菜单项 在我的模型中,我还有一个名为IsSelected的属性,因此我尝试了这种方法: <Menu.ItemTemplate> <HierarchicalDataTemplate DataType="{x:Type Menu:MenuItemViewModel}" ItemsSource="{Binding Path=MenuItems}"> <StackPanel

我使用解决方案来绑定我的
菜单
,就像在本例中一样,我想知道如何将
图标
添加到我的
菜单项

在我的模型中,我还有一个名为
IsSelected
的属性,因此我尝试了这种方法:

<Menu.ItemTemplate>
      <HierarchicalDataTemplate DataType="{x:Type Menu:MenuItemViewModel}" ItemsSource="{Binding Path=MenuItems}">
      <StackPanel Orientation="Horizontal">
         <Image Source="pack://application:,,,/Resources/checked_lightslategray.ico"
                Width="12"
                Height="12"
                Margin="0,0,0,0">
                <Image.Style>
                    <Style TargetType="Image">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=IsSelected}" Value="True">
                                   <Setter Property="Visibility" Value="Visible"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Path=IsSelected}" Value="False">
                                    <Setter Property="Visibility" Value="Collapsed"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Image.Style>
            </Image>
        <TextBlock Text="{Binding Description}" Margin="10,0,0,0"/>
        </StackPanel>
    </HierarchicalDataTemplate>
</Menu.ItemTemplate>

在“图像样式”触发器上,您已将“图像可见性”设置为“折叠”,这将释放图像所需的空间,当没有可见图像时,内容将向左移动

有两种方法可以克服这一问题

选项1: 与其将可见性设置为折叠,不如将可见性设置为隐藏

<Menu.ItemTemplate>
      <HierarchicalDataTemplate DataType="{x:Type Menu:MenuItemViewModel}" ItemsSource="{Binding Path=MenuItems}">
      <StackPanel Orientation="Horizontal">
         <Image Source="pack://application:,,,/Resources/checked_lightslategray.ico"
                Width="12"
                Height="12"
                Margin="0,0,0,0">
                <Image.Style>
                    <Style TargetType="Image">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=IsSelected}" Value="True">
                                   <Setter Property="Visibility" Value="Visible"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Path=IsSelected}" Value="False">
                                    <Setter Property="Visibility" Value="Hidden"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Image.Style>
            </Image>
        <TextBlock Text="{Binding Description}" Margin="10,0,0,0"/>
        </StackPanel>
    </HierarchicalDataTemplate>
</Menu.ItemTemplate>

选项2: -使用标题属性定义描述 -用于定义您的图像

<HierarchicalDataTemplate  ItemsSource="{Binding Path=MenuItems}">
                        <MenuItem Header="{Binding Header}" ItemsSource="{Binding Path=MenuItems}" FontWeight="Bold">
                            <MenuItem.Icon>
                                <Image Source="pack://application:,,,/Resources/checked_lightslategray.ico">
                                    <Image.Style>
                                        <Style TargetType="Image">
                                            <Style.Triggers>
                                                <DataTrigger Binding="{Binding Path=IsSelected}" Value="True">
                                                    <Setter Property="Visibility" Value="Visible"/>
                                                </DataTrigger>
                                                <DataTrigger Binding="{Binding Path=IsSelected}" Value="False">
                                                    <Setter Property="Visibility" Value="Collapsed"/>
                                                </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </Image.Style>
                                </Image>
                            </MenuItem.Icon>
                            <MenuItem.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel Orientation="Horizontal"/>
                                </ItemsPanelTemplate>
                            </MenuItem.ItemsPanel>
                        </MenuItem>
                    </HierarchicalDataTemplate>

在“图像样式”触发器上,您已将“图像可见性”设置为“折叠”,这将释放图像所需的空间,当没有图像可见时,内容将向左移动

有两种方法可以克服这一问题

选项1: 与其将可见性设置为折叠,不如将可见性设置为隐藏

<Menu.ItemTemplate>
      <HierarchicalDataTemplate DataType="{x:Type Menu:MenuItemViewModel}" ItemsSource="{Binding Path=MenuItems}">
      <StackPanel Orientation="Horizontal">
         <Image Source="pack://application:,,,/Resources/checked_lightslategray.ico"
                Width="12"
                Height="12"
                Margin="0,0,0,0">
                <Image.Style>
                    <Style TargetType="Image">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=IsSelected}" Value="True">
                                   <Setter Property="Visibility" Value="Visible"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Path=IsSelected}" Value="False">
                                    <Setter Property="Visibility" Value="Hidden"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Image.Style>
            </Image>
        <TextBlock Text="{Binding Description}" Margin="10,0,0,0"/>
        </StackPanel>
    </HierarchicalDataTemplate>
</Menu.ItemTemplate>

选项2: -使用标题属性定义描述 -用于定义您的图像

<HierarchicalDataTemplate  ItemsSource="{Binding Path=MenuItems}">
                        <MenuItem Header="{Binding Header}" ItemsSource="{Binding Path=MenuItems}" FontWeight="Bold">
                            <MenuItem.Icon>
                                <Image Source="pack://application:,,,/Resources/checked_lightslategray.ico">
                                    <Image.Style>
                                        <Style TargetType="Image">
                                            <Style.Triggers>
                                                <DataTrigger Binding="{Binding Path=IsSelected}" Value="True">
                                                    <Setter Property="Visibility" Value="Visible"/>
                                                </DataTrigger>
                                                <DataTrigger Binding="{Binding Path=IsSelected}" Value="False">
                                                    <Setter Property="Visibility" Value="Collapsed"/>
                                                </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </Image.Style>
                                </Image>
                            </MenuItem.Icon>
                            <MenuItem.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel Orientation="Horizontal"/>
                                </ItemsPanelTemplate>
                            </MenuItem.ItemsPanel>
                        </MenuItem>
                    </HierarchicalDataTemplate>

将其放入您的
菜单。参考资料
并从
堆栈面板
中删除
图像

<Menu.Resources>
    <Image x:Key="img" x:Shared="false" Source="pack://application:,,,/Resources/checked_lightslategray.ico"/>
    <Style TargetType="MenuItem">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsSelected}" Value="true">
                <Setter Property="Icon" Value="{StaticResource img}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Menu.Resources>

将其放入您的
菜单。参考资料
并从
堆栈面板
中删除
图像

<Menu.Resources>
    <Image x:Key="img" x:Shared="false" Source="pack://application:,,,/Resources/checked_lightslategray.ico"/>
    <Style TargetType="MenuItem">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsSelected}" Value="true">
                <Setter Property="Icon" Value="{StaticResource img}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Menu.Resources>


是否可以将图像定位在图标应该放置的左侧?您是否尝试过添加图像路径而不是添加的图标?因为我使用的是样式,我认为需要添加菜单。我尝试在样式中添加资源,但遗憾的是,我不知道在哪里,请查看我的更新,我添加了我正在使用的样式,你能告诉我我需要把这个菜单放在哪里吗?资源代码?你应该添加菜单。资源就在第二行的标签下面。有没有可能把图像放在左边图标应该放的地方?你有没有尝试过添加图像的路径而不是你添加的图标?因为我正在使用样式,我认为需要添加图标菜单。资源进入我的风格,我尝试这样做,但不幸的是我不知道在哪里,请查看我的更新,我添加了我正在使用的风格,你能告诉我我需要把这个菜单放在哪里吗?资源代码?你应该添加菜单。资源就在第二行的标签下面。因为我使用的是样式,我认为需要添加菜单。资源到我的样式中,我尝试这样做,但不幸的是我不知道在哪里,请查看我的更新,我添加了我正在使用的样式,你能告诉我我需要在哪里放置你的代码吗?因为我使用的是样式,我认为需要添加菜单。我尝试将资源添加到我的样式中,但不幸的是我不知道在哪里,请查看我的更新,我添加了我使用的样式,你能告诉我我需要在哪里放置你的代码吗?