2013-03-03 137 views
3

我是WPF的新手,我正在努力尋找解決方案,我正在努力做的事情,因爲我仍然對我是否正確地做這件事有點不確定。WPF樣式觸發器TemplateBinding

我有一個按鈕

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

在XAML,在那裏我已經把佔位{ORIGINAL-COLOR}定義瞭如下的風格,我基本上是想這是與{TemplateBinding Background}二手先前設置控件的值風格的模板。

我見過建議我應該使用{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}但這不起作用。

在此先感謝您的幫助。

+0

以何種方式是不工作?什麼是信息/錯誤或者它是否默默地失敗。確保你檢查了輸出窗口,因爲這是WPF轉儲大量調試信息的地方。 – pbalaga 2013-03-03 15:21:13

+1

由於'Background'的返回類型是'Brush'而不是'Color',因此不能將'Color'與'Background'屬性綁定。 – 2013-03-03 15:22:17

+0

我得到的錯誤如下:找不到目標元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路徑= Background.Color;的DataItem = NULL;目標元素是'GradientStop'(HashCode = 19346574);目標屬性是'顏色'(類型'顏色') – 2013-03-03 15:29:06

回答

2

我認爲問題在於LinearGradientBrush不是FrameworkElement,不屬於佈局樹。只有FrameworkElements具有DataContext屬性,因此可以利用綁定。你要做的是在GradientStop上設置Binding

你的觸發器應該是這樣的:

  <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屬性:'' – 2013-03-03 16:35:39

0

不能綁定ColorBackground的性能,因爲返回類型的BackgroundBrush而不是Color

與Color屬性Brush綁定。由於後臺綁定到資源CompanyBlue所以用在你的觸發以及綁定 -

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

該解決方案不能在觸發器內工作 – 2013-03-03 15:29:34

+0

嘗試更新的答案。 – 2013-03-03 15:56:12

0

嘗試像這樣

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

我希望這將有助於。

+0

這將有助於如果我希望它永遠是那個值,但它可以在使用樣式時被覆蓋(這就是爲什麼我將背景設置爲「{TemplateBinding Background}」)並且希望在此覆蓋的值被使用場景。 – 2013-03-03 16:02:10