2010-11-30 3 views
0

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

<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

Вы создали элемент управления 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:

<MenuItem Header="Delete me" Style="{StaticResource DeleteMenuIcon}" /> 
+0

, кажется, ясно ... так, каким-либо образом не повторить ... Width = "16" Высота = узел "16"? – serhio 2010-11-30 15:49:56

+0

Стили .. Используйте стиль, чтобы установить значок для вас .. Lemme update my answer;) – Arcturus 2010-11-30 15:52:42

1

У меня была такая же проблема, но отмеченное решение не решило для меня. Что сделал решить это ставило 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, х: Shared действительна только при следующих условиях:

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

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

Смежные вопросы