【问题标题】:How to set the icon for image contextMenu items如何设置图像上下文菜单项的图标
【发布时间】:2015-10-12 14:05:41
【问题描述】:

当我单击图像时,它会显示菜单,但不显示图标。我尝试了两种方式:

  1. 一个是我调整了不起作用的图标大小
  2. 第二个是我使用不工作的图标属性设置路径。

如何设置上下文菜单项的图标?

Xaml:

<Image Height="20" Width="20" Source="/CitiCall.WinClient;component/Images/user_icon.png" MouseDown="image1_MouseDown"  Margin="0,0,4,6" HorizontalAlignment="Right"  Name="image1" Stretch="Fill" VerticalAlignment="Top">               
    <Image.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Reset password" Icon="/CitiCall.WinClient;component/Images/reset.png"/>
                <!--<MenuItem.Icon>
                    <Image Source="/CitiCall.WinClient;component/Images/reset.png" ></Image>
                </MenuItem.Icon>
            </MenuItem>-->
            <MenuItem Header="Edit Profile"/>
            <MenuItem Header="Settings"/>
            <MenuItem Header="About us"/>
        </ContextMenu>
    </Image.ContextMenu>
</Image>

Xamal.cs:

private void image1_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    if (e.ChangedButton == MouseButton.Left)
    {
        Image image = sender as Image;
        ContextMenu contextMenu = image.ContextMenu;                
        contextMenu.PlacementTarget = image;
        contextMenu.IsOpen = true;
    }
}

【问题讨论】:

    标签: c# .net wpf xaml contextmenu


    【解决方案1】:

    实际上,如果你写它应该可以工作:

    <MenuItem.Icon>
      <Image Source="Images/reset.png" ></Image>
    </MenuItem.Icon>
    

    只需注意右键单击项目中图像的属性,将其设置为内容,如果较新则复制。

    看看:WPF image resources

    问候

    【讨论】:

    • 是的,发布的链接非常有用。 .
    【解决方案2】:

    这对我有用:

    <Button.ContextMenu>
        <ContextMenu>
            <MenuItem Command="{Binding BringToFront}" ToolTip="Bring to front.">
                <MenuItem.Header>
                    <StackPanel Orientation="Horizontal">
                        <Image Source="{StaticResource Images.TextEditIcon}" Height="14" Width="14" Margin="-20 0 0 0"/>
                        <TextBlock>Bring to Front</TextBlock>
                    </StackPanel>
                 </MenuItem.Header>
             </MenuItem>
        </ContextMenu>
    </Button.ContextMenu>
    

    由于某种原因,使用 &lt;MenuItem Icon="..."&gt; 不起作用。

    在资源字典中:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:presentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options">
        <BitmapImage x:Key="Images.TextEditIcon" UriSource="../Images/TextEditIcon.png" presentationOptions:Freeze="True" />
    </ResourceDictionary>    
    

    您需要在项目中包含图片,并在属性中将类型设置为“资源”。您还需要在某处包含此资源字典。我不会撒谎——在 WPF 中设置图像真的很痛苦。但是一旦设置好,就非常可靠了。

    如果此图像不起作用,请不要直接在 ContextMenu 上对其进行故障排除。相反,请在简单的 StackPanel 或 Grid 中尝试这样的操作:

    <Image Source="{StaticResource Images.TextEditIcon}" Height="14" Width="14"/>
    

    显示后,您可以将其添加到 ContextMenu 中。

    【讨论】:

      【解决方案3】:

      使用后面的 c# 代码,您可以使用 Path Markup Syntax 使用 Path 语法设置图标

      // paths for each menu item icon ...
      string miniPath1 = "M0,0 L8,0 8,1 8,2 0,2 0,1 z";
      string miniPath2 = "F1 M 34,17L 43,17L 43,23L 34,23L 34,17 Z M 35,19L 35,22L 42,22L 42,19L 35,19 Z";
      
      MenuItem mi = new MenuItem { Header = "Menu Item Name", Tag = "My Item" };
      
      Brush brush = Brushes.Black;
      mi.Items.Add(new MenuItem() { Header = "Item1", Icon = ConvertPathToImage(miniPath1, brush) });
      mi.Items.Add(new MenuItem() { Header = "Item2", Icon = ConvertPathToImage(miniPath2, brush) });
      
      ContextMenu cm = new ContextMenu();
      cm.Items.Add(mi);
      

      使用简单的转换:

      private Image ConvertPathToImage(string PathPath, Brush brush)
      {
          Geometry gp = Geometry.Parse(PathPath);
          GeometryDrawing gd = new GeometryDrawing(brush, new Pen(brush, 1.0), gp);
          DrawingImage di = new DrawingImage { Drawing = gd };
          return new Image() { Source = di };
      }
      

      【讨论】:

        猜你喜欢
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 2015-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-03
        相关资源
        最近更新 更多