Подтвердить что ты не робот

WPF: стандартно ли, когда функция menuitem отключена, значок не выделен серым цветом?

У меня есть пункты меню с иконками, и когда он отключен, значок остается тем же. Является ли это для меня отключенным значком, и если это так, применимо ли это к элементам меню, связанным с командой?

4b9b3361

Ответ 1

Да, это полностью зависит от вас. Потому что вы предоставили файл с иконкой. Таким образом, вам нужно создать Style.Trigger в MenuItem, чтобы отключить его. Либо сделайте Opacity = 0.5 или переключите изображение на другое изображение .ico, а IsEnabled = False в шаблоне

Ответ 2

Найдено Jobi ответ полезным. Здесь другой способ выполнить то же самое, используя стиль изображения и MenuItem.Icon:

<MenuItem Header="Add ..." Command="{Binding AddCommand}" >
   <MenuItem.Icon>
      <Image Source="{StaticResource AddImage}" Style="{StaticResource EnableDisableImageStyle}"/>
   </MenuItem.Icon>
</MenuItem>

И стиль:

<Style x:Key="EnableDisableImageStyle" TargetType="{x:Type Image}">
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Opacity" Value="0.75"/>
            <Setter Property="BitmapEffect">
                <Setter.Value>
                    <BlurBitmapEffect Radius="2.0" KernelType="Gaussian"/>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>

Ответ 3

На самом деле у меня была та же проблема, и я не мог найти удовлетворительный ответ на этот вопрос. Изменить прозрачность довольно просто, но что делать, если вы хотите полностью изменить внешний вид иконки для элемента MenuItem. Мне понадобилось два дня, чтобы найти простое решение. Поскольку я довольно новичок в WPF, мне пришлось ознакомиться с различными концепциями, и именно в Attached Properties я получил свое решение. Вот мой код для изменения Icon в зависимости от того, включен/отключен MenuItem:

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

    public static class AltImageProvider
    {
        public static string GetAltImage(DependencyObject obj)
        {
            return (string)obj.GetValue(AltImageProperty);
        }
        public static void SetAltImage(DependencyObject obj, string value)
        {
             obj.SetValue(AltImageProperty, value);
        }

        public static readonly DependencyProperty AltImageProperty = 
               DependencyProperty.RegisterAttached("AltImage",typeof(string),typeof(AltImageProvider));

        public static string GetDefImage(DependencyObject obj)
        {
            return (string)obj.GetValue(DefImageProperty);
        }

        public static void SetDefImage(DependencyObject obj, string value)
        {
            obj.SetValue(DefImageProperty, value);
        }

        public static readonly DependencyProperty DefImageProperty =
              DependencyProperty.RegisterAttached("DefImage",typeof(string),typeof(AltImageProvider));
    }

Вот код, определяющий стиль для изображений, таких как значки, который использует вложенные свойства (DefImage и AltImage):

    <Style x:Key="ImageDisableAltImageStyle" TargetType="Image">
        <Setter Property="Image.Source" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(local:AltImageProvider.DefImage)}"/>
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Image.Source" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(local:AltImageProvider.AltImage)}"/>
            </Trigger>
        </Style.Triggers>
    </Style>

Вот как установить стиль и значки для элемента меню:

    <MenuItem.Icon>
        <Image Style="{StaticResource ImageDisableAltImageStyle}" local:AltImageProvider.DefImage="/Icon/play_green.ico" local:AltImageProvider.AltImage="/Icon/play_grey.ico"/>
    </MenuItem.Icon>

Ответ 4

Это кажется странным, но все, что я сделал, это создать следующий стиль. Вы думаете, что это встроенное поведение, но без этого (например, OP) изображение не затуманивается. При этом на изображение также влияет. И мне не нужно изменять что-либо еще в моем приложении.

<Style TargetType="MenuItem">
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Opacity" Value="0.5"/>
        </Trigger>
    </Style.Triggers>
</Style>