【问题标题】:WPF: programmatically change color of a control with a custom styleWPF:以编程方式更改具有自定义样式的控件的颜色
【发布时间】:2011-10-07 04:15:39
【问题描述】:
<DrawingImage x:Key="HexagonImage">
    <DrawingImage.Drawing>
        <DrawingGroup>
            <GeometryDrawing Brush="White"  
                       Geometry="M 250,0 L 750,0 L 1000,433 L 750,866 L 250,866 L 0,433 Z">
                <GeometryDrawing.Pen>
                    <Pen Brush="Black" Thickness="10" LineJoin="Round"/>
                </GeometryDrawing.Pen>
            </GeometryDrawing>
        </DrawingGroup>
    </DrawingImage.Drawing>
</DrawingImage>

<Style x:Key="HexagonButton" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
        <ControlTemplate TargetType="{x:Type Button}">
            <Grid>
                <Image x:Name="hexImg" Source="{StaticResource HexagonImage}"/>
                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
            </Grid>
        </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我有一个按钮,它的样式是这个 HexagonButton,我想改变它的颜色 以编程方式,我尝试更改 Backgroup 属性,但无济于事。

我设法做到这一点的唯一方法是使用新的绘图图像创建一个全新的样式。 并分配它。但我确信有一种更简单的方法可以做到这一点。

【问题讨论】:

    标签: c# wpf colors wpf-controls


    【解决方案1】:

    我通过将GeomteryDrawing 直接包含在Button 模板中,并使用RelativeSource 绑定到其Button 祖先的ForegroundBackground 属性(我分配给它样式声明中的默认值):

    <Style x:Key="HexagonButton" TargetType="{x:Type Button}">
        <Setter Property="Background" Value="White" />
        <Setter Property="Foreground" Value="Black" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid>
                        <Image x:Name="hexImg">
                            <Image.Source>
                                <DrawingImage>
                                    <DrawingImage.Drawing>
                                        <DrawingGroup>
                                            <GeometryDrawing Brush="{Binding RelativeSource={RelativeSource AncestorType={x:Type Button}}, Path=Background}" Geometry="M 250,0 L 750,0 L 1000,433 L 750,866 L 250,866 L 0,433 Z">
                                                <GeometryDrawing.Pen>
                                                    <Pen Brush="{Binding RelativeSource={RelativeSource AncestorType={x:Type Button}}, Path=Foreground}" Thickness="10" LineJoin="Round" />
                                                </GeometryDrawing.Pen>
                                            </GeometryDrawing>
                                        </DrawingGroup>
                                    </DrawingImage.Drawing>
                                </DrawingImage>
                            </Image.Source>
                        </Image>
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    那么默认的黑白按钮是:

    <Button Style="{StaticResource HexagonButton}">Click me</Button>
    

    自定义按钮是:

    <Button Style="{StaticResource HexagonButton}" Background="Yellow" Foreground="Red">Click me</Button>
    

    【讨论】:

    • 小提示:请考虑使用RelativeSource TemplatedParent(甚至TemplateBinding)代替RelativeSource AncestorType={x:Type Button}
    【解决方案2】:

    如果您只想更改六边形周围的背景,请将Background="{TemplateBinding Background}" 添加到您的ControlTemplate 中的Grid

    如果您还想更改六边形内部的背景颜色,请将您的GeometryDrawingBrush 更改为Transparent

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      相关资源
      最近更新 更多