【问题标题】:Using style from another assembly in Metro application在 Metro 应用程序中使用来自另一个程序集的样式
【发布时间】:2012-03-28 16:02:54
【问题描述】:

我从 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>

[Q] 问题是,如何在 Metro 应用程序中正确声明、引用和使用外部样式?我的想法是创建作为单个 dll 文件交付的可重用控件和通用样式。

【问题讨论】:

    标签: xaml windows-8 microsoft-metro


    【解决方案1】:

    您的源路径错误,因为不支持组件语法。假设您的控件库 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 以获得更深入的解释。

    【讨论】:

    • 我没有用于 Resorce Dictionary 的单独 DLL,但我在同一个 .csproj 的“Common”文件夹下有它,并且我在 App.xaml 中包含了 &lt;ResourceDictionary Source="ms-appx:///Common//MyResourceDictionary.xaml"/&gt; 的路径。但是,我仍然遇到同样的错误???
    • 此答案有效,但非常重要的是要注意,如果您引用的程序集的名称包含空格或点以及可能还有其他非字母数字字符,则它不会。这是 Visual Studio 2012 中的一个错误,几乎让我发疯,直到我为库尝试了不同的项目名称
    【解决方案2】:

    navits 指出答案。

    如果您有一个名为“CustomControl”且带有 ResourceDictionary 的 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 项目。

    【讨论】:

      【解决方案3】:

      只是想补充一点,您还可以使用 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 设计器以与运行时相同的方式显示控件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-03
        • 1970-01-01
        • 2019-07-10
        • 1970-01-01
        • 1970-01-01
        • 2019-12-29
        • 1970-01-01
        • 2013-05-13
        相关资源
        最近更新 更多