代码之家  ›  专栏  ›  技术社区  ›  tdenniston

更改ControlTemplate DataTrigger中的按钮背景

  •  0
  • tdenniston  · 技术社区  · 8 年前

    我想定义一个WPF ControlTemplate 用于“色样”按钮。本质上,我希望能够像这样使用模板:

    <Button Template="{StaticResource SwatchButtonTemplate}" Background="{Binding ActiveColor}">

    哪里 ActiveColor Color 数据上下文中的属性。我已经能够通过这个模板实现这一点:

    <ControlTemplate x:Key="SwatchButtonTemplate" TargetType="{x:Type Button}">
        <Border Name="OuterBorder" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{StaticResource BorderBrush}" Background="{TemplateBinding Background}">
            <Border Name="InnerBorder" BorderThickness="0" BorderBrush="White" Background="{TemplateBinding Background}">
                <ContentPresenter/>
            </Border>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter TargetName="OuterBorder" Property="BorderThickness" Value="1"/>
                <Setter TargetName="InnerBorder" Property="BorderThickness" Value="1"/>
                <Setter TargetName="OuterBorder" Property="BorderBrush" Value="{StaticResource MouseOverAccentBrush}"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    

    但现在我想做的是,如果颜色是透明的,则为按钮背景使用特殊的笔刷(例如,如果颜色透明,则在背景中显示红色“X”)。

    我似乎不知道如何在模板中设置一个触发器来检查背景颜色,如果它是透明的,请使用不同的笔刷来设置背景属性。我尝试将DataTrigger添加到模板中:

        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                ...
            </Trigger>
            <DataTrigger Binding="{TemplateBinding Background}" Value="#00000000">
                <Setter TargetName="InnerBorder" Property="Background" Value="{StaticResource transparent_swatch_brush}"/>
            </DataTrigger>
        </ControlTemplate.Triggers>
    

    但在使用这个时,我得到了一个XamlParseException。

    ObservableCollection<Brush> 打电话 ColorList 充满 SolidColorBrushes (其中一个是透明的)

    <ItemsControl ItemsSource="{Binding ColorList}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button x:Name="button" Background="{Binding}"
                        Template="{StaticResource SwatchButtonTemplate}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Height="20" Rows="1" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
    

    以及完整的模板定义:

    <ControlTemplate x:Key="SwatchButtonTemplate" TargetType="{x:Type Button}">
        <Border Name="OuterBorder" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{StaticResource BorderBrush}" Background="{TemplateBinding Background}">
            <Border Name="InnerBorder" BorderThickness="0" BorderBrush="White" Background="{TemplateBinding Background}">
                <ContentPresenter/>
            </Border>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter TargetName="OuterBorder" Property="BorderThickness" Value="1"/>
                <Setter TargetName="InnerBorder" Property="BorderThickness" Value="1"/>
                <Setter TargetName="OuterBorder" Property="BorderBrush" Value="{StaticResource MouseOverAccentBrush}"/>
            </Trigger>
            <DataTrigger Binding="{Binding Background, RelativeSource={RelativeSource Mode=TemplatedParent}}" Value="#00ffffff">
                <Setter TargetName="InnerBorder" Property="Background" Value="{StaticResource transparent_swatch_brush}"/>
            </DataTrigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    
    2 回复  |  直到 8 年前
        1
  •  0
  •   tdenniston    8 年前

    感谢@EdPlunkett建议避免数据触发器中的“{TemplateBinding…}”。解决方案(仅限XAML)是使用“自”相对源:

    <ControlTemplate x:Key="SwatchButtonTemplate" TargetType="{x:Type Button}">
        <Border Name="OuterBorder" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{StaticResource BorderBrush}" Background="{TemplateBinding Background}">
            <Border Name="InnerBorder" BorderThickness="0" BorderBrush="White" Background="{TemplateBinding Background}">
                <ContentPresenter/>
            </Border>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter TargetName="InnerBorder" Property="BorderThickness" Value="1" />
            </Trigger>
            <DataTrigger Binding="{Binding Path=Background.Color, RelativeSource={RelativeSource Self}}" Value="#00ffffff">
                <Setter TargetName="InnerBorder" Property="Background" Value="{StaticResource transparent_swatch_brush}" />
            </DataTrigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    

        2
  •  0
  •   WPFGermany    8 年前

    您可以通过绑定到类型为的anchestor来修复它 Button 这样地:

    <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            ...
        </Trigger>
        <DataTrigger Binding="{Binding Path=Background, RelativeSource={RelativeSource FindAncestor, AncestorType=Button}}" Value="#00000000">
            <Setter TargetName="InnerBorder" Property="Background" Value="{StaticResource transparent_swatch_brush}"/>
        </DataTrigger>
    

    这将使用 Background 您的财产 按钮