Изменить форму кнопки WPF без изменения других стилей - PullRequest
7 голосов
/ 02 февраля 2012

Я хотел бы изменить форму кнопки WPF с круглого прямоугольника по умолчанию на другую форму (скажем, стрелку), но я хочу оставить остальную часть стиля - цвет заливки, цвет границы, состояния наведения, и т. д. Я хочу, чтобы у кнопки были те же стили, что и у всех других обычных кнопок (что, как мне кажется, зависит от версии Windows, цветов системной темы и т. д., поэтому я не могу воссоздать стиль кнопки с нуля и жесткий код правильные цвета).

Есть ли способ сделать это?

Ответы [ 3 ]

1 голос
/ 02 февраля 2012

Вы должны иметь возможность подкласса обычного кнопочного управления. Затем вы можете настроить подклассную кнопку с пользовательской формой, но все остальные свойства будут унаследованы. Это позволит вам изменить форму для вашей кнопки и ничего больше.

Вот хороший ресурс для создания пользовательской кнопки, если у вас есть Blend:
http://msdn.microsoft.com/en-us/library/bb613598.aspx

0 голосов
/ 03 февраля 2012

Если вы хотите наследовать системные цвета / стили по умолчанию для Button, вы можете использовать TemplateBinding s внутри кнопки Template. Например, если вы хотите создать кнопку пользовательской формы, имеющую тот же цвет фона, что и системный, вы можете использовать следующую команду:

<Button>
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Grid>
                <!-- circle to have inherited colour -->
                <Ellipse Fill="{TemplateBinding Background}" Height="50" Width="50" />
                <ContentPresenter />
            </Grid>
        </ControlTemplate>
    </Button.Template>
</Button>

Ellipse будет наследовать цвет фона от Button, однако он установлен.

0 голосов
/ 02 февраля 2012

Сделайте копию шаблона кнопки по умолчанию и просто измените панель по умолчанию на свою собственную форму.

В случае кнопки, похоже, вам нужно заменить Border чем-то вроде Path, определяющим стрелку.

Поскольку Path не имеет содержимого, вам, вероятно, придется поместить форму и содержимое в другую панель, которая позволяет объектам перекрываться, например, в Grid.

Итак, ваш конечный результат будет выглядеть примерно так

<Grid>
    <Path />
    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>

вместо значения по умолчанию

<Button>
    <ContentPresenter />
</Button>
...