为啥我的 CornerRadius 的 WPF 样式未在 Windows 7 中应用?

Posted

技术标签:

【中文标题】为啥我的 CornerRadius 的 WPF 样式未在 Windows 7 中应用?【英文标题】:Why is my WPF style for CornerRadius not being applied in Windows 7?为什么我的 CornerRadius 的 WPF 样式未在 Windows 7 中应用? 【发布时间】:2020-02-15 12:36:50 【问题描述】:

我在answering an SO question 时创建了一个简单的 WPF 应用程序,我的解决方案适用于我的 Windows 10 机器,但是当我在我的 Windows 7 笔记本电脑上运行该应用程序时,没有应用样式。我相信这与 Window 的风格设置超过了我的风格有关,我怎样才能强制它使用我的风格呢?

我在两台机器上运行相同的 .exe。

<Window.Resources>
    <Style x:Key="CircleButton" TargetType="Button">
        <Style.Resources>
            <Style TargetType="x:Type Border">
                <Setter Property="CornerRadius" Value="1000"/>
            </Style>
        </Style.Resources>
    </Style>
</Window.Resources>

<StackPanel>
    <Button Width="50" Height="50" Margin="10" Style="StaticResource CircleButton"/>
    <Button Width="50" Height="50" Margin="10" Style="StaticResource CircleButton"/>
    <Button Width="50" Height="50" Margin="10" Style="StaticResource CircleButton"/>
</StackPanel>

运行 .NET 4.8 的 Windows 10(应用程序面向 4.6.2) 运行 .NET 4.7.2 的 Windows 7(面向 4.6.2 的应用)

【问题讨论】:

您是否尝试过使用相同的 .NET 版本?另外,&lt;Style TargetType="x:Type Button" BasedOn="StaticResource x:Type Button" x:Key="CircleButton"&gt; 可以帮助解决问题吗? @PavelAnikhouski 我设法找到了一台装有 4.7.2 的 Windows 10 机器,它正确应用了样式,因此确信这不是 .NET 问题,而是 Windows 问题。我也尝试添加 BasedOn 位,但没有任何运气。 【参考方案1】:

PresentationFramework.Aero.dll 中定义的 Windows 7 上的默认样式使用 ButtonChrome 元素而不是 Border 元素,这就是添加隐式 Border 样式无效的原因。

如果您想在 Windows 7 上应用 Windows 10 样式,您可以在 Windows 8 及更高版本上复制PresentationFramework.Aero2.dll 中定义的整个ControlTemplate,并在Template 中设置Template 属性:

<Style x:Key="CircleButton" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                ...
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Resources>
        <Style TargetType="x:Type Border">
            <Setter Property="CornerRadius" Value="1000"/>
        </Style>
    </Style.Resources>
</Style>

您可以通过在 Windows 10 上的 Visual Studio 中的设计模式下右键单击 Button 元素并选择“编辑模板”->“编辑副本”来提取默认模板。

【讨论】:

以上是关于为啥我的 CornerRadius 的 WPF 样式未在 Windows 7 中应用?的主要内容,如果未能解决你的问题,请参考以下文章

WPF:带有cornerRadius和Bevel的按钮模板看起来错误

为啥 MultiBinding 不适用于 CornerRadius

为啥cornerRadius.width/2 不给我一个完美的圆?

为啥cornerRadius的最大值不是矩形的一半?用 UIBezierPath 快速绘制roundedRect

WPF Datatrigger ColorAnimation 不起作用

使用 CornerRadius 在边框内滚动内容