Значки ContextMenu не отображаются - PullRequest
0 голосов
/ 30 ноября 2010

У меня есть несколько изображений, которые я использую в качестве иконок для ContextMenu Предметы:

<UserControl.Resources>
    <Image x:Key="DeleteIco" Source="pack://application:,,,/MyProject.myControl;component/Resources/Delete.ico" Width="16" Height="16"/>
    ...
    <ContextMenu x:Key="MyMenu1">
        <MenuItem Header="Delete" Icon="{StaticResource DeleteIco}"/>
    </ContextMenu>

    <ContextMenu x:Key="MyMenu2">
        <MenuItem Header="Delete me" Icon="{StaticResource DeleteIco}"/>
    </ContextMenu>
<UserControl.Resources>

Иногда в первом меню пропускают значок, иногда во втором ... почему? Я ничего не делаю с иконками в коде.

Ответы [ 2 ]

2 голосов
/ 30 ноября 2010

Вы создали элемент управления Image и дважды пытались поместить его в визуальное дерево. Поскольку все элементы управления могут иметь только одного родителя, ваш Image был отключен. Таким образом, если использовать его второй раз, первый будет отключен, в результате чего ваш значок будет отсутствовать.

Вы можете решить эту проблему, не добавляя Image, а ImageSource вместо своих ресурсов:

<BitmapImage x:Key="DeleteIco" UriSource="pack://application:,,,/MyProject.myControl;component/Resources/Delete.ico" />

Ваше меню должно немного измениться, чтобы оно заработало:

<ContextMenu x:Key="MyMenu1">
    <MenuItem Header="Delete">
         <MenuItem.Icon>
              <Image Source="{StaticResource DeleteIco}" Width="16" Height="16"/>
         </MenuItem.Icon>
    </MenuItem>
</ContextMenu>

<ContextMenu x:Key="MyMenu2">
    <MenuItem Header="Delete me">
         <MenuItem.Icon>
              <Image Source="{StaticResource DeleteIco}" Width="16" Height="16"/>
         </MenuItem.Icon>
    </MenuItem>
</ContextMenu>

Обновление:

Вы также можете использовать стили для установки некоторых основных свойств Image для вас

<Style TargetType="Image">
    <Setter Property="Width" Value="16"/>
    <Setter Property="Width" Value="16"/>
</Style>

Или используйте стиль для MenuItem, чтобы каждый раз устанавливать Icon.

<Style TargetType="MenuItem" x:Key="DeleteMenuIcon">
    <Setter Property="Icon">
        <Setter.Value>
             <Image Source="{StaticResource DeleteIco}" Width="16" Height="16"/>
        </Setter.Value>
    </Setter>
</Style>

И пункт меню:

<MenuItem Header="Delete me" Style="{StaticResource DeleteMenuIcon}" />
1 голос
/ 11 марта 2013

У меня была та же проблема, но помеченное решение не решило ее для меня.Что решило , так это установив x:Shared="False" на ресурсе Image:

<Image x:Key="DeleteIco" 
       x:Shared="False"
       Source="pack://application:,,,/MyProject.myControl;component/Resources/Delete.ico"
       Width="16" Height="16"/>

Как правильно упомянул @Arcturus, вы сейчас настраиваетеэлемент управления изображением как дочерний элемент для нескольких элементов управления, что приводит к тому, что он каждый раз отсоединяется от предыдущего элемента управления, а затем устанавливается только для последнего элемента управления.Установка x:Shared="False" приведет к созданию нового элемента управления Image при каждом запросе ресурса, что решит проблему.

Следует отметить, что атрибут x:Shared нельзя установить везде, поэтомуубедитесь, что вы используете его там, где он действительно применим (из вышеприведенной статьи):

В WPF x: Shared действителен только при следующих условиях:

  • ResourceDictionary, содержащий элементы с x: Shared, должен быть скомпилирован.ResourceDictionary не может быть в свободном XAML или использоваться для тем.

  • ResourceDictionary, содержащий элементы, не должен быть вложенным в другой ResourceDictionary.Например, вы не можете использовать x: Shared для элементов в ResourceDictionary, который находится внутри стиля, который уже является элементом ResourceDictionary.

...