首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不应用来自generic.xaml的样式

不应用来自generic.xaml的样式
EN

Stack Overflow用户
提问于 2012-06-22 01:34:09
回答 5查看 15.2K关注 0票数 23

我创建了一个类库程序集,在其中创建了自定义控件,并在generic.xaml文件中定义了默认样式。

似乎这是一个很常见的问题,只要很多人都在发帖。然而,我无法为我的案子找到任何有用的答案。

  • generic.xaml位于“主题”文件夹中。
  • generix.xaml文件生成操作设置为Page。
  • ThemeInfo是在我的AssemblyInfo.cs中正确定义的。

在测试应用程序中,如果手动将自定义控件程序集中的generic.xaml文件合并到应用程序App.xaml文件中,如下所示:

代码语言:javascript
复制
<Application.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="/MyControlsAssembly;component/Themes/generic.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Application.Resources>

然后,自定义控件正确地以主题为主题,但如果我不手动合并generic.xaml,则这些控件将以默认的Windows主题出现。

你能告诉我我忘记和/或做错了什么吗?

更多信息:

  • 我的ThemeInfo程序集属性定义如下: [assembly: ThemeInfo(ResourceDictionaryLocation.SourceAssembly, ResourceDictionaryLocation.SourceAssembly)] (注意:对于ThemeInfo属性的任何参数组合,结果都是一样的)
  • 主题文件夹中的.xaml文件旁边还有另外两个generic.xaml文件。
  • 主题文件夹中有一个子文件夹,它本身包含另一个.xaml文件。
EN

回答 5

Stack Overflow用户

发布于 2016-01-17 00:04:01

为了在我的自定义控件库中应用Themes\Generic.xaml中的默认样式,我决定从一个成熟的开源控件库(MahApps)中寻找灵感。这个项目为您提供了一个非常好的示例,说明如何构造和布局自定义控件库。

长话短说,要获得Themes\Generic.xaml中的默认样式,您需要在自定义控件库中的AssemblyInfo.cs文件中包含以下内容:

代码语言:javascript
复制
[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]

在我的例子中,我的自定义控件AssemblyInfo.cs看起来如下所示:

代码语言:javascript
复制
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Markup;

[assembly: AssemblyCopyright("...")]
[assembly: ComVisible(false)]

[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0.0")]
[assembly: AssemblyTitleAttribute("...")]
[assembly: AssemblyDescriptionAttribute("")]
[assembly: AssemblyProductAttribute("...")]
[assembly: AssemblyCompany("...")]
票数 16
EN

Stack Overflow用户

发布于 2013-09-01 18:26:21

您需要在自定义控件构造函数中使用以下行:

代码语言:javascript
复制
public class MyCustomControl : Control
{
    static MyCustomControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl)));
    }
}

然后,如果主题文件夹中有一个generic.xaml文件,其示例样式如下:

代码语言:javascript
复制
<Style TargetType="{x:Type local:MyCustomControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyCustomControl}">
                <Border>
                    <Label>Testing...</Label>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

现在,样式将自动应用,而不需要任何额外的合并。

票数 14
EN

Stack Overflow用户

发布于 2022-01-26 14:41:32

在我的例子中,我忘记从x:Key标记中删除<Style>

错误:

代码语言:javascript
复制
<Style TargetType="controls:IpTextBox" x:Key="MyControlStyle">

更正:

代码语言:javascript
复制
<Style TargetType="controls:IpTextBox">
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11149167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档