2013-03-03 105 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