2013-03-03 17 views
3

저는 WPF에 익숙하지 않습니다. 저는이 작업이 올바르게 수행되고 있는지 불확실하기 때문에 제가하고 싶은 일에 대한 해결책을 찾기 위해 고심하고 있습니다.WPF 스타일 트리거 TemplateBinding

내가이 자리 {ORIGINAL-COLOR}을 넣어 한 XAML에서는 버튼

<Style x:Key="ToolBarButtonStyle" TargetType="{x:Type Button}"> 
    <Setter Property="Margin" Value="5" /> 
    <Setter Property="BorderBrush" Value="White" /> 
    <Setter Property="Background" Value="{DynamicResource CompanyBlue}" /> 
    <Setter Property="Foreground" Value="White" /> 
    <Setter Property="FontWeight" Value="Bold" /> 
    <Setter Property="FontSize" Value="20" /> 
    <Setter Property="Width" Value="100" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button">    
       <Border x:Name="ButtonBorder" BorderThickness="5" CornerRadius="5" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         Background="{TemplateBinding Background}" 
         Width="{TemplateBinding Width}"> 
        <ContentPresenter Margin="10" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
       </Border> 


      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Button.Background"> 
       <Setter.Value> 
        <LinearGradientBrush StartPoint="0,-0.2" EndPoint="0,1.2"> 
         <LinearGradientBrush.GradientStops> 
          <GradientStop Color="White" Offset="0" /> 
          <GradientStop Color="{ORIGINAL-COLOR}" Offset="0.5" /> 
          <GradientStop Color="White" Offset="1" /> 
         </LinearGradientBrush.GradientStops> 
        </LinearGradientBrush> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

에 정의 된 다음과 같은 스타일을 가지고, 나는 기본적으로이 이전에 제어 {TemplateBinding Background} 설정에 사용되는 값으로 원하는 스타일의 서식 파일입니다.

나는 {Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}을 사용해야한다는 제안을 보았지만 이것이 작동하지 않습니다.

미리 도움을 청하십시오. BackgroundBrush하지 Color이다의

+0

가 작동하지 않습니다? 메시지/오류 란 무엇인가요? 아니면 자동으로 실패합니까? WPF가 많은 디버그 정보를 덤프하는 곳이기 때문에 출력 창을 확인하십시오. – pbalaga

+1

'Background'의 리턴 타입이'Color'가 아니고'Brush'이기 때문에'Color'를'Background' 속성에 바인드 할 수 없습니다. –

+0

내가 얻는 오류는 다음과 같습니다 : 대상 요소에 대한 통제 FrameworkElement 또는 FrameworkContentElement을 (를) 찾을 수 없습니다. BindingExpression : Path = Background.Color; DataItem = null; 대상 요소는 'GradientStop'(HashCode = 19346574)입니다. 대상 속성이 'Color'(유형 'Color')입니다. –

답변

2

나는 LinearGradientBrushFrameworkElement이 아니며 레이아웃 트리에 속하지 않는다고 생각합니다. FrameworkElements만이 DataContext 속성을 가지므로 바인딩을 사용할 수 있습니다. 당신이하려고하는 것은 을 GradientStop에 설정하는 것입니다.

트리거는 다음과 같이한다 :

  <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Button.Background" 
         Value="{TemplateBinding Background, Converter={StaticResource myConverter}}"> 
       </Setter> 
      </Trigger> 

그리고 myConverter 입력 브러시에서 만든 완전한 LinearGradientBrush 인스턴스를 배경 값을 반환하는 사용자 정의 변환기 클래스입니다. 변환기 작성 방법을 알고 있다고 가정합니다. 리소스에 추가해야 함을 기억하십시오. 이 같은

더 많거나 적은 무엇인가 : 어떤 방법으로

class BrushToGradient : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var brush = (Brush)value; 
     var gradient = new LinearGradientBrush(); 

     //Make it manually 
     gradient.GradientStops.Add(...); 
     //... 
     return gradient; 
    } 

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

나는이 해결 방법을 몇 가지 조정할 수 있습니다. 트리거에서 TemplateBinding 바로 가기를 사용할 수없고 또한 실제 컨트롤 템플릿 때문에 Setter에 TargetName 특성을 설정해야했습니다.

0

당신은 반환 형식 때문에 Background 속성 Color을 바인딩 할 수 없습니다.

색이 Bind with Brush입니다. 배경은 CompanyBlue 자원을 바인더 제본되어 있기 때문에 그렇게뿐만 아니라 트리거에 바인딩을 사용 -

<GradientStop Color="{Binding Color, Source={StaticResource CompanyBlue}}" 
       Offset="0.5" /> 
+0

이 해결책은 트리거 내에서 작동하지 않습니다 –

+0

업데이트 된 답변을 시도하십시오. –

0

내가이 도움이되기를 바랍니다이

<GradientStop Color="White" Offset="0" /> 
<GradientStop Color="{DynamicResource CompanyBlue}" Offset="0.5" /> 
<GradientStop Color="White" Offset="1" /> 

처럼보십시오.

+0

내가 항상 그 값을 원한다면 도움이 될 것입니다. 그러나 스타일을 사용할 때 덮어 쓸 수 있습니다. (배경을'{TemplateBinding Background}'로 설정하는 이유입니다.) 덮어 쓰기 된 값을이 태그에 사용하기를 원할 것입니다 대본. –