WPF Windows 8兼容性问题

问题描述 投票:5回答:4

给定一个按钮(或组合框,或任何控件):

<Button x:Name="button" Command="{Binding DoStuff}" Margin="10,0,5,5" Content="Do Stuff!" Style="{StaticResource buttonDefaults}"/>

随风格:

<Style x:Key="buttonDefaults" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
        <Style.Resources>
            <ResourceDictionary Source="/PresentationFramework.Aero;component/themes/Aero.NormalColor.xaml"/>
        </Style.Resources>
        <Setter Property="Background">
            <Setter.Value>
                <RadialGradientBrush>
                    <GradientStop Color="#F4083268" Offset="1"/>
                    <GradientStop Color="#FE5C9247"/>
                </RadialGradientBrush>
            </Setter.Value>
        </Setter>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="FontSize" Value="16"/>
        <Setter Property="Focusable" Value="False"/>
    </Style>

它在Windows 8中看起来与在Windows 7中看起来非常不同。

现在,奇怪的是,在DESIGNER中,一切在Windows 8机器上看起来都很完美,就好像它是Windows 7 ......但在运行时,风格并没有“应用”。

另一方面,它在设计器和运行时的Windows 7上看起来都很完美。有没有办法来解决这个问题?

额外细节:

随着风格的RD:

    <Style x:Key="buttonDefaults" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
        <Style.Resources>
            <ResourceDictionary Source="/PresentationFramework.Aero,Version=4.0.0.0,Culture=Neutral,PublicKeyToken=31bf3856ad364e35,processorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml"/>
        </Style.Resources>
        <Setter Property="Background">
            <Setter.Value>
                <RadialGradientBrush>
                    <GradientStop Color="#F4083268" Offset="1"/>
                    <GradientStop Color="#FE5C9247"/>
                </RadialGradientBrush>
            </Setter.Value>
        </Setter>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="FontSize" Value="16"/>
        <Setter Property="Focusable" Value="False"/>
    </Style>

结果如下:http://i61.tinypic.com/willvk.png

使用应用程序范围中的RD:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/PresentationFramework.Aero,Version=4.0.0.0,Culture=Neutral,PublicKeyToken=31bf3856ad364e35,processorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <Style x:Key="buttonDefaults" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
            <Setter Property="Background">
                <Setter.Value>
                    <RadialGradientBrush>
                        <GradientStop Color="#F4083268" Offset="1"/>
                        <GradientStop Color="#FE5C9247"/>
                    </RadialGradientBrush>
                </Setter.Value>
            </Setter>
            <Setter Property="BorderBrush" Value="Transparent"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="FontFamily" Value="Arial"/>
            <Setter Property="FontSize" Value="16"/>
            <Setter Property="Focusable" Value="False"/>
        </Style>
    </ResourceDictionary>
</Application.Resources>

结果如下:http://i61.tinypic.com/24nob9y.png

我想将第二个的视觉效果应用于单一样式,而不是整个应用程序。

c# wpf xaml compatibility resourcedictionary
4个回答
5
投票

我认为您的问题源于您使用部分程序集名称的事实。 According to MSDN,当您使用部分程序集名称时,不会搜索GAC程序集。

在进行其他详细更新后进行修改

看完截图后,我终于明白了你的新问题。问题与资源范围有关。在控件中定义样式时,在添加aero覆盖之前,按钮会继承按钮样式。您可以通过在所需控件的顶部添加Panel来轻松调整它,并将其用作资源的范围容器。更新的代码如下:

<Window x:Class="AeroTestSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="191" Width="246">
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <Button Content="Do Stuff!" Padding="10" Margin="10"/>
        <StackPanel>
            <StackPanel.Resources>
                <ResourceDictionary Source="/PresentationFramework.Aero,Version=4.0.0.0,Culture=Neutral,PublicKeyToken=31bf3856ad364e35,processorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml"/>
            </StackPanel.Resources>
            <Button Content="Do Stuff!" Padding="10" Margin="10">
                <Button.Resources>
                    <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
                        <Setter Property="Background">
                            <Setter.Value>
                                <RadialGradientBrush>
                                    <GradientStop Color="#F4083268" Offset="1"/>
                                    <GradientStop Color="#FE5C9247"/>
                                </RadialGradientBrush>
                            </Setter.Value>
                        </Setter>
                        <Setter Property="BorderBrush" Value="Transparent"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="FontFamily" Value="Arial"/>
                        <Setter Property="FontSize" Value="48"/>
                        <Setter Property="Focusable" Value="False"/>
                    </Style>
                </Button.Resources>
            </Button>
        </StackPanel>
    </StackPanel>
</Window>

这个截图有效:


1
投票

设计师有一个错误,这就是为什么它在Windows 8中显示错误的样式。我认为问题源于Windows 7和8系统主题具有相同的名称(aero.normalcolor),WPF必须手动检查Windows 8并使用主题名称aero2.normalcolor

至于你的问题,我不会加载整个(巨大的)主题资源字典只是为了设置单个按钮的样式。而是将按钮样式和模板从aero.normalcolor.xaml(位于Blend安装目录下的Blend\SystemThemes\Wpf\v4.0\aero.normalcolor.xaml下)复制到资源字典中。 WPF实际上并不使用操作系统中的任何资源,因此代码可以在任何操作系统版本下运行。


0
投票

是否有一个实际的原因,你加入你的风格资源词典PresentationFramework.Aero?如果我没有弄错,对于每个版本的Windows,它可能会有所不同,分别由于这可能是不同的View。另外我认为在这种情况下,为Style BasedOn指定没有多大意义,你也可以尝试删除它。

有一些提示可以帮助:

  • 尝试删除对此ResourceDictionary的引用
  • 尝试将App.xaml文件中的所有资源字典移动到那里
  • 为每个Control创建一个ControlTemplate,他的视图对于所有版本的Windows都是“常量”

0
投票

我不确定您是否想要修复Windows 8设计模式,或者您想要创建一个在不同操作系统上看起来相同的应用程序。在第二个here is a blog post的情况下,如何强制WPF / .NET在不同的Windows版本(例如XP,7和8)上使用相同的样式。

© www.soinside.com 2019 - 2024. All rights reserved.