2010-11-29 5 views

답변

6

버튼을 사용할 수 없을 때 이미지의 불투명도를 줄이기 위해 특수한 스타일을 사용하고 있습니다 (예, 단추가 바인딩 된 경우에도 가능합니다. 명령). 기술적으로,이 불포화되지 않지만이 비슷하고 자신의 솔루션을 도출 도움이 될 수 있습니다 : 여기

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

이다 채도 쉐이더 (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에서 사용할 수 있습니다, 강도가 바인딩 그래서 그것을 접선 순이익은 트리거를 통해 활성화 :

<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> 
관련 문제