好的,这就是问题所在。我试图找出如何使这项工作:
考虑以下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:静态做什么?
答案 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"/>