基于templatebinding背景色WPF更改内容模板的lineargradient偏移颜色
好吧,问题来了。我正试图找出如何使这项工作: 请考虑以下ControlTemplate以创建自定义按钮:基于templatebinding背景色WPF更改内容模板的lineargradient偏移颜色,wpf,xaml,controltemplate,templatebinding,lineargradientbrush,Wpf,Xaml,Controltemplate,Templatebinding,Lineargradientbrush,好吧,问题来了。我正试图找出如何使这项工作: 请考虑以下ControlTemplate以创建自定义按钮: <ControlTemplate x:Key ="cButton" TargetType="{x:Type Button}"> <!--Styles--> <Grid x:Name="bkg"> <Grid.Background> <LinearGradientBrush StartP
<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中用错误注释标记的行没有使用templatebinding检索背景颜色?如果我使用纯色,它会工作得很好,所以我看不出为什么它不能以这种方式工作。请提供发生这种情况的原因
下面的内容仍然有点不清楚,我不知道它们是否与问题有关,如果有人能把它们弄清楚,那就太好了
问题2:这两个TargetType值“Button”和“{x:Type Button}”之间有什么区别。我知道它们是一种等价物,但两者之间有什么区别吗?我读过MSDN,但真正的区别并不那么清楚
问题3:何时使用x:Name,何时使用Name?两者之间的区别仍然不清楚
问题4:x:Static做什么?我认为您的模板不能正常工作,因为背景属性是笔刷(类)。然后尝试将其绑定到颜色(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>
或者您可以像这样使用绑定(如果您确定背景是SolidColorBrush):
2)3)4)非常感谢hameleon86-因此,对于其他读者来说,总结一下-x:Type是一个标记扩展,当在其他标记扩展中使用时,前者(可以用作元素中的属性/值属性)会引起混淆,因为它可能引用键而不是类型。x:Name可以从任何地方访问,可以访问任何东西,而Name可以在FrameworkElement范围内使用。x:静态,用于从代码中的常量到XAMLBrush类的数据传输。从代码中可以看出,Brush类正在使用渐变停止中的颜色结构,所以我不这么认为。如何在没有转换器的情况下获得颜色形式笔刷?我认为这是不可能的,因为系统不知道你想要使用哪种笔刷(纯色?渐变色?自定义?),类似的问题我只是在其中一个渐变停止中使用颜色(纯色)。我怎样才能将一个参数从元素传递到渐变停止点,使其根据使用该线性渐变的元素而改变?请检查代码。这应该是可能的。GradientStop是一种颜色,背景是画笔。简单地说,如果我写一个转换器来提取画笔中的颜色,代码会工作吗?我这样做是因为我需要按钮有一个渐变完成,并根据我从按钮元素中传入的值着色。如果有更合适的方法(例如将一些变量从按钮传递到线性渐变中),请务必让我知道,因为可能我的做法是错误的。
<GradientStop Color="{Binding Path=Background.Color, RelativeSource={RelativeSource TemplatedParent}}" Offset="0.5"/>