Есть ли способ обесцветить изображение на кнопке, которая отключена? - PullRequest
3 голосов
/ 29 ноября 2010

Есть ли способ обесцветить изображения в отключенных кнопках?например.ICommand.CanExecute = false?или мне нужно использовать отдельные изображения + Стиль / Триггеры

Ответы [ 2 ]

6 голосов
/ 29 ноября 2010

Я использую для этого специальный стиль, который уменьшает непрозрачность изображения, когда кнопка отключается (да, это также работает, если кнопка привязана к команде).Технически, это не ненасыщенность, но она похожа и может помочь вам найти решение самостоятельно:

<Style x:Key="buttonImage">
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type Button}, AncestorLevel=1}, Path=IsEnabled}" Value="False">
            <Setter Property="Image.Opacity" Value="0.25"></Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>
5 голосов
/ 15 января 2014

Вот десатурация шейдера (Desaturate.fx):

sampler2D  inputSampler : register(S0);
/// <summary>The strength of the effect.</summary>
/// <minValue>0</minValue>
/// <maxValue>1</maxValue>
/// <defaultValue>0</defaultValue>
float Strength : register(C0);

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 srcColor = tex2D(inputSampler, uv);
    float3 rgb = srcColor.rgb;
    float3 c = (1 - Strength)*rgb + Strength* dot(rgb, float3(0.30, 0.59, 0.11));
    return float4(c, srcColor.a);
}

Скомпилируйте его и добавьте файл .ps в качестве ресурса, а затем оберните его так:

public class Desaturate : ShaderEffect
{
    public static readonly DependencyProperty InputProperty = ShaderEffect.RegisterPixelShaderSamplerProperty(
        "Input",
        typeof(Desaturate),
        0);

    public static readonly DependencyProperty StrengthProperty = DependencyProperty.Register(
        "Strength",
        typeof(double),
        typeof(Desaturate),
        new UIPropertyMetadata(((double)(0D)), PixelShaderConstantCallback(0)));

    public Desaturate()
    {
        PixelShader pixelShader = new PixelShader();
        pixelShader.UriSource = new Uri("/So.Wpf;component/Effects/Desaturate.ps", UriKind.Relative);
        this.PixelShader = pixelShader;

        this.UpdateShaderValue(InputProperty);
        this.UpdateShaderValue(StrengthProperty);
    }
    public Brush Input
    {
        get
        {
            return ((Brush)(this.GetValue(InputProperty)));
        }
        set
        {
            this.SetValue(InputProperty, value);
        }
    }
    /// <summary>The strength of the effect. 0 is unchanged and 1 is monochrome</summary>
    public double Strength
    {
        get
        {
            return ((double)(this.GetValue(StrengthProperty)));
        }
        set
        {
            this.SetValue(StrengthProperty, value);
        }
    }
}

Затем вы можете использовать его в Xaml следующим образом: сила привязывается, так что np подключает его к включенному через триггер:

<Grid>
    <Image Source="http://i.imgur.com/CN63KcN.jpg">
        <Image.Effect>
            <effects:Desaturate Strength="{Binding ElementName=SaturationSlider, Path=Value}"/>
        </Image.Effect>
    </Image>
    <Slider x:Name="SaturationSlider" Minimum="0" Maximum="1" VerticalAlignment="Bottom"/>
</Grid>
...