应用主题到WPF并使用样式。

12 浏览
0 Comments

应用主题到WPF并使用样式。

我正在尝试为一系列WPF项目应用主题。有一个包含generic.xaml和不同应用程序的程序集。据我所了解,我不能使用ThemeInfo属性和ResourceDictionaryLocation.ExternalLocation,因为名称必须与我的程序相同,但我有多个程序...

所以我搜索并发现我只需要在app.xaml中将字典作为MergedDictionary包含进去就可以了:


    
        
            
        
    

这基本上是有效的。但是,如果我为控件使用样式,它将不再应用generic.xaml样式:

ClassLibrary1.dll中的generic.xaml



程序中的窗口


    
        
    
    
        

我必须做什么,才能让WPF将我的generic.xaml样式作为所有按钮的基本样式(我知道我还必须编写ControlTemplate;上面的代码只是为了简单起见)?

0
0 Comments

问题的出现原因是WPF不会自动应用基类的样式模板,需要手动设置。解决方法可以尝试以下两种方式:

1. 创建一个通用的ButtonBase样式/模板,用于设置所有按钮的外观。

2. 在ButtonGreeTextStyle上使用BasedOn属性,基于现有样式进行设置。

根据我的了解,WPF不会自动应用基类的样式模板。使用BasedOn属性可以解决这个问题,但我想知道是否应该在默认情况下WPF应用样式,因为它是在generic.xaml中定义的。

代码示例:





注意:以上代码只是示例,实际应根据具体需求进行修改。

0
0 Comments

问题的出现原因是想要在WPF中应用主题和使用样式,但是发现默认样式会从Aero主题恢复为Classic主题。解决方法是编写基于自定义标记的样式,并使用对应的MarkupExtension来应用当前主题的样式。具体的代码可以在这里找到:

public class ThemeResourceExtension : MarkupExtension
{
    public ThemeResourceExtension() { }
    public ThemeResourceExtension(object resourceKey)
    {
        this.ResourceKey = resourceKey;
    }
    public object ResourceKey { get; set; }
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (this.ResourceKey == null)
        {
            var provideValueTarget = serviceProvider.GetService();
            if (provideValueTarget != null)
            {
                var fe = provideValueTarget.TargetObject as FrameworkElement;
                if (fe != null)
                {
                    return fe.FindResource(typeof(ThemeResourceExtension));
                }
            }
        }
        else
        {
            var resourceKey = this.ResourceKey as Type;
            if (resourceKey != null)
            {
                return Application.Current.FindResource(resourceKey);
            }
            return Application.Current.FindResource(this.ResourceKey);
        }
        return null;
    }
}

使用方法如下:

其中`local`是指向自定义命名空间的别名,`ButtonStyle`表示要应用的样式。

这样就可以在WPF中应用主题和使用样式,而且不会恢复为Classic主题。

0