WPF: программно изменить цвет элемента управления с помощью собственного стиля - PullRequest
5 голосов
/ 17 июля 2011
<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, но безрезультатно.

единственныйТо, как мне удалось это сделать, - это создать совершенно новый стиль с новым графическим изображением.и назначить его.Но я уверен, что есть более простой способ сделать это.

Ответы [ 2 ]

2 голосов
/ 17 июля 2011

Я получил его для работы, включив GeomteryDrawing непосредственно в шаблон Button и используя RelativeSource привязки к свойствам Foreground и Background его предка Button (которому я назначил по умолчанию в объявлении стиля):

<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>
1 голос
/ 17 июля 2011

Если вы хотите изменить фон только вокруг шестиугольника, добавьте Background="{TemplateBinding Background}" к Grid в вашем ControlTemplate.

Если вы хотите изменить цвет фона внутришестиугольник, измените Brush вашего GeometryDrawing на Transparent.

...