基于模板绑定背景颜色WPF更改内容模板的线性渐变偏移颜色

时间:2013-01-18 00:53:59

标签: wpf xaml controltemplate templatebinding lineargradientbrush

好的,这就是问题所在。我试图找出如何使这项工作:

考虑以下ControlTemplate来创建自定义按钮:

<ControlTemplate x:Key ="cButton" TargetType="{x:Type Button}">
      <!--Styles-->
      <Grid x:Name="bkg">
      <Grid.Background>
         <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
           <GradientStop Color="{TemplateBinding Background}" Offset="0.5"/><!-- Error! -->
           <GradientStop Color="White" Offset="1.0"/>
       </LinearGradientBrush>
      </Grid.Background>
      <ContentPresenter 
    TextBlock.FontSize="80" 
    HorizontalAlignment="Center" 
    VerticalAlignment="Center" 
    ContentSource="Content" />
      </Grid>
      <!--Triggers-->
      <ControlTemplate.Triggers>
         <Trigger Property="IsPressed" Value="True">
         <Setter TargetName="bkg" Property="Background" Value="White"/>
         </Trigger>
      </ControlTemplate.Triggers>
   </ControlTemplate>

此控制模板构成此脚本的一部分,您可以看到我正在尝试从主网格中列出的按钮声明中获取背景颜色。

<Grid>
<Grid.Resources>
   <ControlTemplate x:Key ="cButton" TargetType="{x:Type Button}">
      <!--Styles-->
      <Grid x:Name="bkg">
      <Grid.Background>
         <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
           <GradientStop Color="{TemplateBinding Background}" Offset="0.5"/><!-- Error! -->
           <GradientStop Color="White" Offset="1.0"/>
       </LinearGradientBrush>
      </Grid.Background>
      <ContentPresenter 
    TextBlock.FontSize="80" 
    HorizontalAlignment="Center" 
    VerticalAlignment="Center" 
    ContentSource="Content" />
      </Grid>
      <!--Triggers-->
      <ControlTemplate.Triggers>
         <Trigger Property="IsPressed" Value="True">
         <Setter TargetName="bkg" Property="Background" Value="White"/>
         </Trigger>
      </ControlTemplate.Triggers>
   </ControlTemplate>
  </Grid.Resources>
  <Grid.ColumnDefinitions>
   <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="*"/>
  </Grid.ColumnDefinitions >
  <Button Name="btnIn" Grid.Column="0" Content="IN" Background="Green"  Foreground="White" Template="{StaticResource cButton}"/>
  <Button Name="btnOut" Grid.Column="1" Content="OUT" Background="Red" Foreground="White" Template="{StaticResource cButton}" />
  </Grid>

好的,现在主要问题是这个......

问题1:为什么在按钮的ControlTemplate中标有错误注释的行没有使用模板绑定检索背景颜色?如果我使用纯色它会工作得很好,所以我认为没有理由不应该以这种方式工作。请说明发生这种情况的原因。

以下内容仍然有点不清楚,我不知道它们是否与问题有关,如果有人能够清除它们会很好。

问题2:这两个TargetType值“Button”和“{x:Type Button}”之间有什么区别。我知道他们是等同的,但两者之间有什么区别吗?我读过MSDN,但真正的区别并不是那么清楚。

问题3:我何时会使用x:名称,何时使用姓名?差异再次不明确。

问题4:x:静态做什么?

1 个答案:

答案 0 :(得分:0)

我认为您的模板无法正常工作,因为Background属性是Brush(类)。并尝试将其绑定到Color(struct)

UPD 您可以使用这样的简单转换器:

public class BrushToColorConverter: IValueConverter{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        SolidColorBrush b = value as SolidColorBrush;
        if (b != null)
        {
            return b.Color;
        }
        return null;
    }

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

将其添加到资源:

<wpfApplication1:BrushToColorConverter x:Key="btcConv"/>

修改你的风格:

 <Grid.Background>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                        <GradientStop Color="{Binding Path=Background, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource btcConv}}" Offset="0.5"/>
                        <GradientStop Color="White" Offset="1.0"/>
                    </LinearGradientBrush>
                </Grid.Background>

或者您可以像这样使用绑定(如果您确定Background是SolidColorBrush):

<GradientStop Color="{Binding Path=Background.Color, RelativeSource={RelativeSource TemplatedParent}}" Offset="0.5"/>