Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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
.net 更改WPF按钮的形状而不更改其他样式_.net_Wpf - Fatal编程技术网

.net 更改WPF按钮的形状而不更改其他样式

.net 更改WPF按钮的形状而不更改其他样式,.net,wpf,.net,Wpf,我想将WPF按钮的形状从默认的圆形矩形更改为另一个形状(例如箭头),但我想保留其余的样式--填充颜色、边框颜色、悬停状态等。我希望按钮与所有其他常规按钮具有相同的样式(我认为这取决于Windows的版本、系统主题颜色等。因此,我不能从头开始重新创建按钮样式并硬编码正确的颜色) 有什么方法可以做到这一点吗?复制,只需将默认面板更改为您自己的自定义形状即可 对于按钮,您似乎需要将边框替换为定义箭头的路径 由于路径没有内容,您可能需要将形状和内容放在另一个允许对象重叠的面板中,例如网格 所以你的最终结

我想将WPF按钮的形状从默认的圆形矩形更改为另一个形状(例如箭头),但我想保留其余的样式--填充颜色、边框颜色、悬停状态等。我希望按钮与所有其他常规按钮具有相同的样式(我认为这取决于Windows的版本、系统主题颜色等。因此,我不能从头开始重新创建按钮样式并硬编码正确的颜色)

有什么方法可以做到这一点吗?

复制,只需将默认面板更改为您自己的自定义形状即可

对于按钮,您似乎需要将
边框
替换为定义箭头的
路径

由于路径没有内容,您可能需要将形状和内容放在另一个允许对象重叠的面板中,例如网格

所以你的最终结果是这样的

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

而不是默认值

<Button>
    <ContentPresenter />
</Button>

您应该能够对普通按钮控件进行子类化。然后您可以使用自定义形状自定义子类化按钮,但所有其他属性都将被继承。这将允许您更改按钮的形状,而无需更改其他内容

如果您有Blend,这里有一个创建自定义按钮的好资源:

如果要继承
按钮的默认系统颜色/样式
,可以在按钮
模板
中使用
模板绑定
。例如,如果要创建与系统按钮具有相同背景色的自定义形状按钮,可以使用以下选项:

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


椭圆
将继承
按钮
的背景色,不管它是如何设置的。

这确实正确地获得了背景色,但它只是一个圆。没有边框,没有悬停或单击状态,内容上没有渐变光泽。我试图避免从头开始制作整个按钮。我如何获得“默认按钮模板"?您链接到的MSDN文章有一个示例模板,但它不是默认模板。@HenryJackson我认为它是颜色以外的默认模板。默认情况下,它从
SystemColor
中提取颜色。另一种方法是在Expression Blend中复制模板。您能给我一个如何仅覆盖边界的示例吗?T这篇MSDN文章展示了如何在Blend中从头开始创建主题,这并不是我想要做的。