Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于templatebinding背景色WPF更改内容模板的lineargradient偏移颜色_Wpf_Xaml_Controltemplate_Templatebinding_Lineargradientbrush - Fatal编程技术网

基于templatebinding背景色WPF更改内容模板的lineargradient偏移颜色

基于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以创建自定义按钮:

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