我从Windows 8 C#XAML user and custom controls sample开始并移动了文件
Themes/Generic.xaml
BasicCustomControl.cs
BasicUserControl.xaml
BasicUserControl.xaml.cs
ImageWithLabelControl.cs
到名为Controls
的Metro类库,在UserAndCustomControls
项目中引用它并更正local:...
对xmlns:local="using:Controls"
的引用。这很有效。
但是如果在类库中使用
创建资源字典"Style.xaml"
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Controls">
<Color x:Key="ColorBackground">Red</Color>
</ResourceDictionary>
并包含在ScenarioList.xaml
文件
<Page.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Controls;component/Style.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Page.Resources>
我收到运行时错误
XamlParseException
Failed to assign to property 'Windows.UI.Xaml.ResourceDictionary.Source'.
如果我尝试将颜色应用于网格
<Grid>
<Grid.Background>
<SolidColorBrush Color="{StaticResource ColorBackground}" />
</Grid.Background>
<ListBox x:Name="Scenarios" ...
[...]
</Grid>
[问] 问题是,如何在Metro应用程序中正确声明,引用和使用外部样式?我的想法是创建可重用的控件和作为单个dll文件提供的常见样式。
答案 0 :(得分:10)
您的源路径错误,因为不支持组件语法。假设您的控件库DLL被称为“控件”,那么它将是这样的:
<ResourceDictionary Source="ms-appx:///Controls/Files/Style.xaml" />
您可以查看http://timheuer.com/blog/archive/2012/03/07/creating-custom-controls-for-metro-style-apps.aspx以获得更深入的解释。
答案 1 :(得分:4)
navits指出答案。
如果你有一个带有ResourceDictionary的名为“CustomControl”的dll 名为“Styles.xaml”的名称包含名为“Themes”的文件夹。
对于C#项目,App.xaml应包含:
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ms-appx:///CustomControls/Themes/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
使用源路径中的Themes
文件夹,用于C#项目。
和
对于VB.Net项目,App.xaml应包含:
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ms-appx:///CustomControls/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
没有源路径中的Themes
文件夹,用于VB.Net项目。
答案 2 :(得分:0)
只需补充一点,您还可以使用 pack 表示法从引用的程序集中获取资源,并且如果其名称包含点,它也可以使用:
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/AtlasInformatics.UI;component/Themes/Generic.xaml"></ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
在此示例中,带有控件的库的标准“ Generic.xaml”被导入到“ App.xaml”的ResourceDictionary中,以使Visual Studio设计器以与运行时相同的方式显示控件。