| page_type | 姓名 | 语言 | 产品 | 描述 | ||||
|---|---|---|---|---|---|---|---|---|
样本 | 流利的XAML主题编辑器 |
|
| 一个工具和示例应用程序,向您展示如何轻松地主题您的应用程序。通过还可以为您提供轻巧的工具,以使您的自定义主题在应用程序中栩栩如生,从而启动这一点。 |

该仓库包含了Fluent XAML主题编辑器的完整解决方案和源代码 - 一种工具,有助于通过在通用Windows Platform(UWP)应用中为我们的ResourceCrectionaly框架生成XAML标记来证明流利设计系统的灵活性,并支持App开发过程。
位于此存储库中的源代码是在Visual Studio中使用的通用Windows平台创建的,旨在在支持通用Windows平台的台式机,移动设备和未来设备上运行。
注意:如果您不熟悉XAML,通用Windows平台,流利的设计或资源和资源评估,强烈建议您访问Design Universal Windows平台站点,并熟悉此工具的意图。
此应用程序需要Visual Studio 2017更新4或更高版本,Windows 10或Windows Software开发套件(SDK)版本17763或更高版本的Windows 10。
获取免费的Visual Studio 2017 Community Edition副本,并支持构建通用Windows平台应用程序
此外,要保持对Windows和开发工具的最新更新,请加入Windows Insider程序,成为Windows Insider。
成为Windows Insider
如果您不想与此开源项目分开,而只是想使用该应用程序本身,请使用此工具的Microsoft Store版本并在此处下载。
借助预览构建,您可以为右侧属性中的浅色和深色主题选择三种主要颜色。

除了每个主题的三种主要颜色外,您还可以展开任何主要颜色,以查看仅改变某些控制零件外观的小颜色列表 - 这基本上使您可以对状态的颜色选择更详细。

要访问颜色的详细视图,只需单击主要颜色按钮色板旁边的人字形即可。
编辑器将带有一些预设,供您查看,以了解应用程序中主题的样子。预设下拉列表位于颜色词典属性面板的顶部。
当您第一次启动时,它将始终设置为默认值 - 这是我们所有控件的浅色主题样式默认值。您可以选择不同的主题,例如薰衣草和夜间,以了解该工具如何主题我们的控件。
准备好开始自己的主题后,就开始编辑颜色!一旦开始调整它们,您会注意到预设Combobox从预设的名称变为“自定义”:
这意味着您已经开始了一个新的临时主题,该主题是“自定义”。您所做的任何更改都不会影响该框中的任何其他预设。
主题编辑器的最后一部分可能是创建主题的最重要部分之一,也就是说,在任何一个主题中,您都符合对比。该工具在选择颜色时,在颜色选择窗口的左侧为您提供了一小部分对比度信息。

在此窗口中,您可以看到与您选择编辑的主题中最普遍的文本颜色的对比,在上面的情况下,黑色文本,因为您正在编辑轻型主题颜色值。
当您选择低于4.5:1标准对比度的颜色时,您会在对比度值旁边的红色文本中提醒您。

您可以在这里了解更多有关对比度及其重要性的信息。
一旦以所有内容为主题,您都需要在应用程序中使用它!为此,您需要单击颜色词典属性面板底部的“导出”按钮。

该按钮将打开一个带有通用的,未命名的资源存根的弹出窗口(如下所示)。

但是,如果您想对主题进行一些更改并将其重新出口到“导出窗口”,则此窗口不会使您更改为更改的颜色值。
但是,一旦您准备在应用中使用它,请单击右下角的“复制到剪贴板”按钮,然后转到UWP Visual Studio解决方案。
进入Visual Studio后,右键单击位于解决方案资源管理器中的项目解决方案。

然后转到添加>新项目,然后选择资源词典。

命名该词典对您有意义,然后在完成后单击“添加”。

这应该产生像这样的空白资源:
< ResourceDictionary
xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "
xmlns : x = " http://schemas.microsoft.com/winfx/2006/xaml "
xmlns : local = " using:MyAppName " >
</ ResourceDictionary >现在,您可以将导出的主题代码从编辑器粘贴到该资源范围内。
< ResourceDictionary
xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "
xmlns : x = " http://schemas.microsoft.com/winfx/2006/xaml "
xmlns : local = " using:MyAppName " >
<!-- Free Public License 1.0.0 Permission to use, copy, modify, and/or distribute this code for any purpose with or without fee is hereby granted. -->
< ResourceDictionary .ThemeDictionaries>
< ResourceDictionary x : Key = " Default " >
< ResourceDictionary .MergedDictionaries>
< ColorPaletteResources Accent = " #FF0073CF " AltHigh = " #FF000000 " AltLow = " #FF000000 " AltMedium = " #FF000000 " AltMediumHigh = " #FF000000 " AltMediumLow = " #FF000000 " BaseHigh = " #FFFFFFFF " BaseLow = " #FF333333 " BaseMedium = " #FF9A9A9A " BaseMediumHigh = " #FFB4B4B4 " BaseMediumLow = " #FF676767 " ChromeAltLow = " #FFB4B4B4 " ChromeBlackHigh = " #FF000000 " ChromeBlackLow = " #FFB4B4B4 " ChromeBlackMedium = " #FF000000 " ChromeBlackMediumLow = " #FF000000 " ChromeDisabledHigh = " #FF333333 " ChromeDisabledLow = " #FF9A9A9A " ChromeGray = " #FF808080 " ChromeHigh = " #FF808080 " ChromeLow = " #FF151515 " ChromeMedium = " #FF1D1D1D " ChromeMediumLow = " #FF2C2C2C " ChromeWhite = " #FFFFFFFF " ListLow = " #FF1D1D1D " ListMedium = " #FF333333 " />
< ResourceDictionary >
< Color x : Key = " SystemChromeAltMediumHighColor " >#CC000000</ Color >
< Color x : Key = " SystemChromeAltHighColor " >#FF000000</ Color >
< Color x : Key = " SystemRevealListLowColor " >#FF1D1D1D</ Color >
< Color x : Key = " SystemRevealListMediumColor " >#FF333333</ Color >
< Color x : Key = " RegionColor " >#FF000000</ Color >
< SolidColorBrush x : Key = " RegionBrush " Color = " {StaticResource RegionColor} " />
</ ResourceDictionary >
</ ResourceDictionary .MergedDictionaries>
</ ResourceDictionary >
< ResourceDictionary x : Key = " Light " >
< ResourceDictionary .MergedDictionaries>
< ColorPaletteResources Accent = " #FF0073CF " AltHigh = " #FFFFFFFF " AltLow = " #FFFFFFFF " AltMedium = " #FFFFFFFF " AltMediumHigh = " #FFFFFFFF " AltMediumLow = " #FFFFFFFF " BaseHigh = " #FF000000 " BaseLow = " #FFCCCCCC " BaseMedium = " #FF898989 " BaseMediumHigh = " #FF5D5D5D " BaseMediumLow = " #FF737373 " ChromeAltLow = " #FF5D5D5D " ChromeBlackHigh = " #FF000000 " ChromeBlackLow = " #FFCCCCCC " ChromeBlackMedium = " #FF5D5D5D " ChromeBlackMediumLow = " #FF898989 " ChromeDisabledHigh = " #FFCCCCCC " ChromeDisabledLow = " #FF898989 " ChromeGray = " #FF737373 " ChromeHigh = " #FFCCCCCC " ChromeLow = " #FFECECEC " ChromeMedium = " #FFE6E6E6 " ChromeMediumLow = " #FFECECEC " ChromeWhite = " #FFFFFFFF " ListLow = " #FFE6E6E6 " ListMedium = " #FFCCCCCC " />
< ResourceDictionary >
< Color x : Key = " SystemChromeAltMediumHighColor " >#CCFFFFFF</ Color >
< Color x : Key = " SystemChromeAltHighColor " >#FFFFFFFF</ Color >
< Color x : Key = " SystemRevealListLowColor " >#FFE6E6E6</ Color >
< Color x : Key = " SystemRevealListMediumColor " >#FFCCCCCC</ Color >
< RevealBackgroundBrush x : Key = " SystemControlHighlightListLowRevealBackgroundBrush " TargetTheme = " Light " Color = " {ThemeResource SystemRevealListMediumColor} " FallbackColor = " { StaticResource SystemListMediumColor} " />
< Color x : Key = " RegionColor " >#FFFFFFFF</ Color >
< SolidColorBrush x : Key = " RegionBrush " Color = " {StaticResource RegionColor} " />
</ ResourceDictionary >
</ ResourceDictionary .MergedDictionaries>
</ ResourceDictionary >
< ResourceDictionary x : Key = " HighContrast " >
< StaticResource x : Key = " RegionColor " ResourceKey = " SystemColorWindowColor " />
< SolidColorBrush x : Key = " RegionBrush " Color = " {StaticResource RegionColor} " />
</ ResourceDictionary >
</ ResourceDictionary .ThemeDictionaries>
</ ResourceDictionary >现在,您有一个完全自定义的颜色主题等待使用,所以让我们应用它!
为此,您需要进入您的页面或app.xaml(取决于您希望将主题应用的应用程序的数量),并将主题字典合并到该页面或应用程序的资源中。
< Page .Resources>
< ResourceDictionary >
< ResourceDictionary .MergedDictionaries>
< ResourceDictionary Source = " PurpleGreenTheme.xaml " />
</ ResourceDictionary .MergedDictionaries>
</ ResourceDictionary >
</ Page .Resources>最后,不要忘记将页面的背景颜色设置为您为主题选择的区域彩色。这是唯一不会自动设置的刷子。
< Grid Background = " {ThemeResource RegionBrush} " >
<!-- Your page layout/content here -->
</ Grid >一旦进入,您就完成了!您的主题颜色现在将在您的应用程序或页面上普遍存在。
要访问后面代码中的colorPaletTereSources API,并在运行时更改任何颜色属性,请循环循环浏览app.xaml中的合并词典(或在您合并主题的范围中),并抓住对当前使用的资源correscectixtionary作为colorPaleTterTereSourceSourceSourceSourceSourceSourceSourceSourceSourceSourceSourceSourceSourceSourceSourceSource实例
这是如何在C#中抓取和编辑colorPalettereSources上的属性的示例:
public MainPage ( )
{
this . InitializeComponent ( ) ;
ColorPaletteResources cpr = FindColorPaletteResourcesForTheme ( "Light" ) ;
cpr . Accent = Colors . Red ;
ReloadPageTheme ( this . RequestedTheme ) ;
}
private void ReloadPageTheme ( ElementTheme startTheme )
{
if ( this . RequestedTheme == ElementTheme . Dark )
this . RequestedTheme = ElementTheme . Light ;
else if ( this . RequestedTheme == ElementTheme . Light )
this . RequestedTheme = ElementTheme . Default ;
else if ( this . RequestedTheme == ElementTheme . Default )
this . RequestedTheme = ElementTheme . Dark ;
if ( this . RequestedTheme != startTheme )
ReloadPageTheme ( startTheme ) ;
}
private ColorPaletteResources FindColorPaletteResourcesForTheme ( string theme )
{
foreach ( var themeDictionary in Application . Current . Resources . ThemeDictionaries )
{
if ( themeDictionary . Key . ToString ( ) == theme )
{
if ( themeDictionary . Value is ColorPaletteResources )
{
return themeDictionary . Value as ColorPaletteResources ;
}
else if ( themeDictionary . Value is ResourceDictionary targetDictionary )
{
foreach ( var mergedDictionary in targetDictionary . MergedDictionaries )
{
if ( mergedDictionary is ColorPaletteResources )
{
return mergedDictionary as ColorPaletteResources ;
}
}
}
}
}
return null ;
}我们不建议您在运行时经常执行此操作,因为您可能会遇到一些性能问题,但是如果放置在设置页面或您不希望用户经常切换的区域中,则性能并不是太糟糕了。
提示!您需要重新加载资源范围,以获取其中的资源,以获取您应用的任何新颜色更改。您可以通过将请求的主题翻转到另一个主题并再次返回来做到这一点。这就是ReloAdpagetheme函数正在做的。
尽管该工具的导出代码中使用的API适用于17744年或更高版本,但它并不是要使您的主题在较早的SDK版本上工作并不是太复杂了。
当您导出主题时,您会看到带有colorPaletterersources定义的资源评估标记:
< ResourceDictionary .ThemeDictionaries>
< ResourceDictionary x : Key = " Default " >
< ResourceDictionary .MergedDictionaries>
< ColorPaletteResources Accent = " #FF8961CC " AltHigh = " #FF000000 " AltLow = " #FF000000 " AltMedium = " #FF000000 " AltMediumHigh = " #FF000000 " AltMediumLow = " #FF000000 " BaseHigh = " #FFFFFFFF " BaseLow = " #FF64576B " BaseMedium = " #FFB6AABC " BaseMediumHigh = " #FFCBBFD0 " BaseMediumLow = " #FF8D8193 " ChromeAltLow = " #FFCBBFD0 " ChromeBlackHigh = " #FF000000 " ChromeBlackLow = " #FFCBBFD0 " ChromeBlackMedium = " #FF000000 " ChromeBlackMediumLow = " #FF000000 " ChromeDisabledHigh = " #FF64576B " ChromeDisabledLow = " #FFB6AABC " ChromeGray = " #FFA295A8 " ChromeHigh = " #FFA295A8 " ChromeLow = " #FF332041 " ChromeMedium = " #FF3F2E4B " ChromeMediumLow = " #FF584960 " ChromeWhite = " #FFFFFFFF " ListLow = " #FF3F2E4B " ListMedium = " #FF64576B " />
< ResourceDictionary >
< Color x : Key = " RegionColor " >#FF262738</ Color >
< SolidColorBrush x : Key = " RegionBrush " Color = " {StaticResource RegionColor} " />
</ ResourceDictionary >
</ ResourceDictionary .MergedDictionaries>
</ ResourceDictionary >对于我们的SystemColors,ColorPaletTereSources是位于generic.xaml中的友好的API,并允许将这些SystemColors在任何级别范围内进行范围。
如果您想启用相同的主题以下级工作,则必须通过主题中的每种颜色单独定义每个SystemColor:
< ResourceDictionary >
< ResourceDictionary .ThemeDictionaries>
< ResourceDictionary x : Key = " Default " >
< Color x : Key = " SystemAltHighColor " >#FF000000</ Color >
< Color x : Key = " SystemAltLowColor " >#FF000000</ Color >
< Color x : Key = " SystemAltMediumColor " >#FF000000</ Color >
< Color x : Key = " SystemAltMediumHighColor " >#FF000000</ Color >
< Color x : Key = " SystemAltMediumLowColor " >#FF000000</ Color >
< Color x : Key = " SystemBaseHighColor " >#FFFFFFFF</ Color >
< Color x : Key = " SystemBaseLowColor " >#FF64576B</ Color >
< Color x : Key = " SystemBaseMediumColor " >#FFB6AABC</ Color >
< Color x : Key = " SystemBaseMediumHighColor " >#FFCBBFD0</ Color >
< Color x : Key = " SystemBaseMediumLowColor " >#FF8D8193</ Color >
< Color x : Key = " SystemChromeAltLowColor " >#FFCBBFD0</ Color >
< Color x : Key = " SystemChromeBlackHighColor " >#FF000000</ Color >
< Color x : Key = " SystemChromeBlackLowColor " >#FFCBBFD0</ Color >
< Color x : Key = " SystemChromeBlackMediumLowColor " >#FF000000</ Color >
< Color x : Key = " SystemChromeBlackMediumColor " >#FF000000</ Color >
< Color x : Key = " SystemChromeDisabledHighColor " >#FF64576B</ Color >
< Color x : Key = " SystemChromeDisabledLowColor " >#FFB6AABC</ Color >
< Color x : Key = " SystemChromeHighColor " >#FFA295A8</ Color >
< Color x : Key = " SystemChromeLowColor " >#FF332041</ Color >
< Color x : Key = " SystemChromeMediumColor " >#FF3F2E4B</ Color >
< Color x : Key = " SystemChromeMediumLowColor " >#FF584960</ Color >
< Color x : Key = " SystemChromeWhiteColor " >#FFFFFFFF</ Color >
< Color x : Key = " SystemChromeGrayColor " >#FFA295A8</ Color >
< Color x : Key = " SystemListLowColor " >#FF3F2E4B</ Color >
< Color x : Key = " SystemListMediumColor " >#FF64576B</ Color >
< Color x : Key = " SystemAccentColor " >#FF8961CC</ Color >
< Color x : Key = " RegionColor " >#FF262738</ Color >
< SolidColorBrush x : Key = " RegionBrush " Color = " {StaticResource RegionColor} " />
</ ResourceDictionary >
</ ResourceDictionary .ThemeDictionaries>
</ ResourceDictionary >在这种情况下,我们使用Lavendar主题来显示此下层过渡。
警告:尽管此标记格式更改将使您的主题能够在早期的SDK版本中跨控件应用,但它将在页面,容器或控制范围的范围上不起作用。 ColorPaletTereSources是允许范围行为的API。此标记格式仅适用于app.xaML级别的早期SDK。
该工具是直接从功能团队创建的,尽管我们欢迎您的投入和改进该工具的建议,但目前我们不接受公众的任何功能或更改。请定期检查,因为我们将来可能会发展我们的贡献模型。
该项目采用了Microsoft开源的行为代码。有关更多信息,请参阅《行为代码常见问题》或与[email protected]联系,并提供任何其他问题或评论。
有关其他Windows源代码,工具和示例,请参阅GitHub上的Windows。