为啥我的 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 版本?另外,<Style TargetType="x:Type Button" BasedOn="StaticResource x:Type Button" x:Key="CircleButton">
可以帮助解决问题吗?
@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