【问题标题】:Is there a way to desaturate an Image on a Button thats disabled?有没有办法使禁用的按钮上的图像去饱和?
【发布时间】:2010-11-29 15:05:44
【问题描述】:

有没有一种方法可以使禁用的按钮中的图像去饱和?例如。 ICommand.CanExecute = false?还是我需要使用单独的图像 + 样式/触发器

【问题讨论】:

    标签: wpf triggers styles icommand


    【解决方案1】:

    我为此使用了一种特殊的样式,当按钮被禁用时,它会降低图像的不透明度(是的,如果按钮绑定到命令,这也有效)。从技术上讲,这不是去饱和,但它看起来很相似,它可能会帮助您自己得出一个解决方案:

    <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>
    

    【讨论】:

      【解决方案2】:

      这是一个去饱和的着色器(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>
      

      【讨论】:

        猜你喜欢
        • 2011-08-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-25
        • 2017-12-23
        • 2020-09-15
        • 2021-09-16
        • 1970-01-01
        • 2014-05-24
        相关资源
        最近更新 更多