2012-10-29 8 views
3

클릭시 배경을 밝게하고 싶습니다. 그래서 나는 다음과 같은 한 :버튼으로 배경색을 밝게하려면 변환기로 바인딩 당

<converter:ColorLightConverter x:Key="colorLightConverter" /> 

...

<Style BasedOn="{StaticResource default}" TargetType="{x:Type controls:Button}">    
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type controls:Button}"> 
        <ControlTemplate.Triggers>        
         <Trigger Property="IsPressed" Value="True"> 
          <Setter Property="Background"> 
           <Setter.Value> 
            <SolidColorBrush Color="{Binding Path=Background.Color, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource colorLightConverter}}" /> 
           </Setter.Value> 
          </Setter> 
         </Trigger> 
        </ControlTemplate.Triggers> 
        <Border Background="{TemplateBinding Background}" 
          BorderBrush="Transparent" 
          BorderThickness="0"> 
         ...        
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

컨버터 :

class ColorLightConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      Color color = (Color)value; 
      System.Drawing.Color lightColor = ControlPaint.Light(System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B)); 

      return Color.FromArgb(lightColor.A, lightColor.R, lightColor.G, lightColor.B); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

하지만이 버튼을 클릭하면 컨버터가 호출되지 않습니다. 바인딩에 문제가있는 것 같지만 오류가 표시되지 않습니다 ...

도와 주시겠습니까?

아마도 완전히 틀렸어. 기본적으로 원하는 작업 : 단추를 클릭 할 때 현재 배경색을 사용하고 밝게합니다. 아니 더 ...

업데이트 1 :

바인딩을 약간 변경 :

나는 다음과 같은 시도

<Trigger Property="IsPressed" Value="True"> 
          <Setter Property="Background" Value="{Binding Path=Background.Color, RelativeSource={RelativeSource Self}, Converter={StaticResource colorLightConverter}}" /> 
         </Trigger> 

이 컨버터를 변경 (지금은 SolidColorBrush를 반환) :

class ColorLightConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      Color color = (Color)value; 
      System.Drawing.Color lightColor = ControlPaint.Light(System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B)); 

      return new SolidColorBrush(Color.FromArgb(lightColor.A, lightColor.R, lightColor.G, lightColor.B)); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

이제 변환기가 호출되었지만 몇 번이고 다시 호출되므로 몇 초 후에 stackoverflow 예외가 발생합니다. 이 무한 루프는 어디에서 오는가? 나는 조금 혼란 스럽다 ...

+1

무한 루프는 Background.Color에 바인딩하고 WPF 속성 시스템으로 속성 변경 알림을 트리거하는 배경 설정, 바인딩이 새로 고침되도록하는 등의 문제가 있습니다. . 바인딩 모드를 OneTime으로 설정하면이 문제를 해결할 수있을 것 같습니다. –

+0

고맙습니다 HighCore, Mode = OneTime이 트릭을했습니다! 이 솔루션을 추가 답변으로 사용 하시겠습니까? – tklepzig

답변

1

WPF에서 System.Drawing.Color를 사용하면 안됩니다. 대신 System.Windows.Media.Color를 사용하십시오. 또 다른 중요한 점은 ControlTemplate.Triggers 내의 Setters는 RelativeSource TemplatedParent를 사용하여 컨트롤을 참조 할 필요가 없다는 것입니다. 바로 :

<Trigger Property="IsPressed" Value="True"> 
    <Setter Property="Background" Value="YourLightColor"/> 
</Trigger> 

나머지는 동일하게 유지하십시오. 사용자 정의 논리를 지정해야하는 경우 이제 (예 : 컨버터로, 그냥 세터의 컨버터를 배치

편집 :. 무한 루프는 Background.Color에 바인딩 한 다음 설정하고 있다는 사실에서 비롯 WPF 속성 시스템에 속성 변경 알림을 트리거하는 배경, 바인딩이 새로 고침되는 등 ... 바인딩 모드를 = OneTime으로 설정하여이 문제를 해결할 수 있다고 생각합니다.

+0

"그냥 변환기를 해당 설정기에 배치"하는 것이 무슨 뜻입니까? 변환기로는 어떻게 생겼을까요? – tklepzig

0

나는 Button에 다음과 같은 스타일을 사용했다. 그것은 당신을 도울 수 있습니다.

<Style TargetType="{x:Type Button}"> 
    <!-- General for all buttons --> 
    <Setter Property="Foreground" 
      Value="Azure" /> 
    <Setter Property="FontFamily" 
      Value="Verdana" /> 
    <Setter Property="FontSize" 
      Value="12" /> 
    <Setter Property="FontWeight" 
      Value="Bold" /> 
    <Setter Property="Margin" 
      Value="4,4,4,4"></Setter> 
    <Setter Property="VerticalAlignment" 
      Value="Center"></Setter> 
    <Setter Property="Background"> 
     <Setter.Value> 
      <RadialGradientBrush> 
       <GradientStop Color="#145082" 
           Offset="0" /> 
       <GradientStop Color="Black" 
           Offset="1" /> 
      </RadialGradientBrush> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Grid> 
        <Rectangle x:Name="GelBackground" 
           Opacity="1" 
           RadiusX="9" 
           RadiusY="9" 
           Fill="{TemplateBinding Background}"></Rectangle> 
        <Rectangle x:Name="GelShine" 
           Margin="2,2,2,0" 
           VerticalAlignment="Top" 
           RadiusX="4" 
           RadiusY="4" 
           Opacity=".8" 
           Stroke="Transparent" 
           Height="15"> 
         <Rectangle.Fill> 
          <LinearGradientBrush StartPoint="0,0" 
               EndPoint="0,1"> 
           <GradientStop Color="#ccffffff" 
               Offset="0" /> 
           <GradientStop Color="Transparent" 
               Offset="1" /> 
          </LinearGradientBrush> 
         </Rectangle.Fill> 
        </Rectangle> 
        <ContentPresenter Margin="10,0,10,0" 
             VerticalAlignment="Center" 
             HorizontalAlignment="Center" /> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" 
          Value="true"> 
         <Setter Property="Foreground" 
           Value="White" /> 
         <Setter Property="FontSize" 
           Value="12" /> 
         <Setter Property="Rectangle.Fill" 
           TargetName="GelBackground"> 
          <Setter.Value> 
           <RadialGradientBrush> 
            <GradientBrush.GradientStops> 
             <GradientStopCollection> 
              <GradientStop Color="Tomato" 
                  Offset="0" /> 
              <GradientStop Color="Black" 
                  Offset="1" /> 
             </GradientStopCollection> 
            </GradientBrush.GradientStops> 
           </RadialGradientBrush> 
          </Setter.Value> 
         </Setter> 
        </Trigger> 
        <Trigger Property="IsPressed" 
          Value="true"> 
         <Setter Property="Foreground" 
           Value="Black" /> 
         <Setter Property="Fill" 
           TargetName="GelBackground"> 
          <Setter.Value> 
           <RadialGradientBrush> 
            <GradientStop Color="#ffcc00" 
                Offset="0" /> 
            <GradientStop Color="#cc9900" 
                Offset="1" /> 
           </RadialGradientBrush> 
          </Setter.Value> 
         </Setter> 
        </Trigger> 
        <Trigger Property="IsEnabled" 
          Value="false"> 
         <Setter Property="Foreground" 
           Value="Black" /> 
         <Setter Property="Fill" 
           TargetName="GelBackground"> 
          <Setter.Value> 
           <RadialGradientBrush> 
            <GradientStop Color="White" 
                Offset="0" /> 
            <GradientStop Color="#333333" 
                Offset=".4" /> 
            <GradientStop Color="#111111" 
                Offset=".6" /> 
            <GradientStop Color="#000000" 
                Offset=".7" /> 
            <GradientStop Color="#000000" 
                Offset="1" /> 
           </RadialGradientBrush> 
          </Setter.Value> 
         </Setter> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
0

문제는 배경과 모든 속성의, 배경은 항상 이런 식으로 역할을 정확히 이유를 모르겠지만 대신 배경의 템플릿을 설정하면 문제가 해결된다 :

<Style TargetType="{x:Type controls:Button}"> 
     <Style.Triggers> 
      <Trigger Property="IsPressed" Value="True"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type controls:Button}"> 
          <Border> 
           <Border.Background> 
            <SolidColorBrush Color="{Binding RelativeSource={RelativeSource TemplatedParent}, 
             Path=Background.Color, Converter={StaticResource colorLightConverter}}"/> 
           </Border.Background> 
           <ContentPresenter Content="{TemplateBinding Content}"/> 
          </Border> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Setter Property="Template"> 
     <Setter.Value.../> 
    </Setter> 
    </Style> 
관련 문제