使用Metro应用程序中另一个程序集的样式

Luí*_*oni 4 xaml microsoft-metro windows-8

我从Windows 8 C#XAML用户和自定义控件示例开始并移动文件

Themes/Generic.xaml
BasicCustomControl.cs
BasicUserControl.xaml
BasicUserControl.xaml.cs
ImageWithLabelControl.cs
Run Code Online (Sandbox Code Playgroud)

到名为的Metro类库Controls,在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>
Run Code Online (Sandbox Code Playgroud)

并包含在ScenarioList.xaml文件中

<Page.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Controls;component/Style.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Page.Resources>
Run Code Online (Sandbox Code Playgroud)

我收到运行时错误

XamlParseException
Failed to assign to property 'Windows.UI.Xaml.ResourceDictionary.Source'.
Run Code Online (Sandbox Code Playgroud)

如果我尝试将颜色应用于网格

<Grid>
    <Grid.Background>
        <SolidColorBrush Color="{StaticResource ColorBackground}" />
    </Grid.Background>

    <ListBox x:Name="Scenarios" ...
    [...]
</Grid>
Run Code Online (Sandbox Code Playgroud)

[问]问题是,如何在Metro应用程序中正确声明,引用和使用外部样式?我的想法是创建可重用的控件和作为单个dll文件提供的常见样式.

小智 10

您的源路径错误,因为不支持组件语法.假设您的控件库DLL被称为"控件",那么它将是这样的:

<ResourceDictionary Source="ms-appx:///Controls/Files/Style.xaml" />
Run Code Online (Sandbox Code Playgroud)

您可以查看http://timheuer.com/blog/archive/2012/03/07/creating-custom-controls-for-metro-style-apps.aspx以获得更深入的解释.

  • 这个答案是有效的,但是非常重要的是要注意,如果引用的程序集的名称包含空格或点以及可能还有其他非字母数字字符,则不会.这是Visual Studio 2012中的一个错误,几乎让我疯狂,直到我为该库尝试了不同的项目名称 (3认同)