Невозможно установить значок для элемента меню, используя ItemContainerStyle - PullRequest
5 голосов
/ 24 июня 2011

Я пытаюсь установить значок моего пункта меню следующим образом -

 <Grid>
    <Grid.Resources>
        <Image
              x:Key="ReportIconImage" Height="20" Width="20"
              Source="/Resource/flag.png"/>
        <Image
              x:Key="ReportIconImage1" Height="20" Width="20"
              Source="/Resource/flag.png"/>
    </Grid.Resources>
    <Menu Height="22" Margin="0,9,0,0" Name="menu1" VerticalAlignment="Top">
        <MenuItem Header="Menu">
            <MenuItem Header="Save" ></MenuItem>
            <MenuItem Header="Open"/>
            <MenuItem Header="Exit"/>
            <MenuItem.ItemContainerStyle>
                <Style TargetType="{x:Type MenuItem}">
                    <Setter  
                        Property="Icon" 
                        Value="{StaticResource ReportIconImage}">
                    </Setter>
                </Style>
            </MenuItem.ItemContainerStyle>
        </MenuItem>
        <MenuItem Header="Edit">
            <MenuItem Header="Undo"/>                   
            <MenuItem Header="Redo"/>                    
            <Separator/>
            <MenuItem Header="Cut"/>                    
            <MenuItem Header="Copy"/>                    
            <MenuItem  Header="Paste"/>
            <MenuItem.ItemContainerStyle>
                <Style TargetType="{x:Type MenuItem}">
                    <Setter  
                         Property="Icon" 
                         Value="{StaticResource ReportIconImage1}">
                </Setter>
                </Style>
            </MenuItem.ItemContainerStyle>
        </MenuItem>
    </Menu>
</Grid>

, но отображается значок только для последнего пункта меню, а не для первых двух.

enter image description here

Пример приложения - http://weblogs.asp.net/blogs/akjoshi/Samples/WPFMenuItemBugSample.zip

Может кто-нибудь сообщить причину такого поведения и возможные решения / обходные пути.

Ответы [ 3 ]

8 голосов
/ 24 июня 2011

Это потому, что вы использовали Image в своих ресурсах.Image является элементом управления и, как и любой другой элемент управления, может иметь только одного родителя.По умолчанию WPF пытается совместно использовать ресурсы для всех потребителей.Таким образом, последние MenuItem «выигрывают» кастодиальные права на Image, а другие MenuItem даже не допускаются в выходные дни.

Чтобы исправить это, вы можете либо установить Image чтобы не делиться:

<Image x:Shared="False" .../>

Или, что еще лучше, укажите свой ресурс изображения как соответствующий ImageSource подкласс и поделитесь им:

<BitmapImage x:Key="ReportIconImage" Uri="/Resource/flag.png"/>
...
<Setter Property="Icon">
    <Setter.Value>
        <Image Source="{StaticResource ReportIconImage}"/>
    </Setter.Value>
</Setter>
5 голосов
/ 07 октября 2011

Немного поздно, но вот решение, которое сработало для меня.

Я использовал конвертер для создания нового изображения для каждого пункта меню:

class PathToImageConverter:IValueConverter
{
    object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string path = "Data/Icons/" + value + ".png";
        Image img = new Image {Source = new BitmapImage(new Uri(path, UriKind.Relative))};
        return img;
    }

    object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return "";
    }
}

Xaml:

   <MenuItem.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Icon" Value="{Binding Converter={StaticResource PathToImageConverter1}}"/>
        </Style>
    </MenuItem.ItemContainerStyle>
0 голосов
/ 01 июля 2011

Будет ли работать просто добавить свойство значка к каждому элементу меню напрямую, без использования стиля? Может быть, я что-то упускаю, но это то, что я сделал в своих приложениях.

<Grid>
    <Menu Height="22" Margin="0,9,0,0" Name="menu1" VerticalAlignment="Top">
        <MenuItem Header="Menu">
            <MenuItem.Icon>
                <Image Height="20" Width="20" Source="/Resourceflag.png"/>
            </MenuItem.Icon>

            <MenuItem Header="Save" ></MenuItem>
            <MenuItem Header="Open"/>
            <MenuItem Header="Exit"/>
        </MenuItem>
        <MenuItem Header="Edit">
            <MenuItem.Icon>
                <Image Height="20" Width="20" Source="/Resourceflag.png"/>
            </MenuItem.Icon>

            <MenuItem Header="Undo"/>                   
            <MenuItem Header="Redo"/>                    
            <Separator/>
            <MenuItem Header="Cut"/>                    
            <MenuItem Header="Copy"/>                    
            <MenuItem  Header="Paste"/>
        </MenuItem>
    </Menu>
</Grid>
...