2016-07-21 12 views
1

現在のUWPアプリケーションで複数のコントロールのスタイルを含むResourceDictionaryを分割しようとしています。このファイルは約3000行にまで拡大しており、管理が難しくなっているので、それをより細かく分割してResourceDictionariesに変更し、MergedDictionariesを使用するようにしました。UWPのMergedDictionariesでResourceDestariesをネストする

App.xaml

<common:BootStrapper x:Class="Asteria.Ion.App" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:common="using:Template10.Common" 
        xmlns:styles="using:Asteria.Ion.Styles" 
        RequestedTheme="Dark"> 

    <common:BootStrapper.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Styles\Custom.xaml" /> 
       <ResourceDictionary Source="Styles\CustomControls.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </common:BootStrapper.Resources> 
</common:BootStrapper> 

CustomControls.xamlResourceDictionariesへの参照が含まれています。

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:controls="using:Template10.Controls" 
    xmlns:behaviors="using:Template10.Behaviors" 
    xmlns:interactivity="using:Microsoft.Xaml.Interactivity" 
    xmlns:local="using:Asteria.Ion.Styles"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="Shared.xaml" /> 
     <ResourceDictionary Source="Templates.xaml" /> 
     <ResourceDictionary Source="ComponentBlock.xaml" /> 
     <ResourceDictionary Source="FlowAgent.xaml" /> 
     <ResourceDictionary Source="Planning.xaml" /> 
     <ResourceDictionary Source="ProjectDialog.xaml" /> 
     <ResourceDictionary Source="Inspector.xaml" /--> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

これは、常に次の例外を生成します: Failed to assign to property 'Windows.UI.Xaml.ResourceDictionary.Source' because the type 'Windows.Foundation.String' cannot be assigned to the type 'Windows.Foundation.Uri'. [Line: 12 Position: 37]

を私はソースURIに何度も変更しようとしましたが、それはこのエラーを与え続けています。 CustomControls.xamlのすべてのResourceDictionary要素をコメントアウトするだけで役立ちます。しかし、私はもちろん、スタイルの欠如に関する例外を取得します。

いくつかのURIフォーマットは、私が試してみた:の

  • /Styles/Shared.xaml
  • Styles/Shared.xaml
  • Styles\Shared.xaml
  • .\Shared.xaml
  • ms-appx:///Styles/Shared.xaml

なし仕事。

アドバイスをいただければ幸いです。

+0

私は外部のアセンブリのスタイルを参照しようとしていません。 –

+0

私は参照してください。とにかくこの構文を試してみるべきでしょうか? –

答えて

2

最終的にはURI構造とは関係ありませんが、ThemeDictionariesMergedDictionariesの組み合わせです。

App.Resourcesで::前に働いていた何

Themes.xamlThemeDictionariesCustomControls.xamlを含ま

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="Styles/Themes.xaml" /> 
    <ResourceDictionary Source="Styles/CustomControls.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

<Styles>(それらの多く)が含まれていました。

CustomControls.xamlを分割した後、スタイルは含まれなくなりましたが、MergedDictionariesのみです。このような何か探し :

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="ControlStyles/ProjectDialog.xaml" /> 
    <ResourceDictionary Source="ControlStyles/Inspector.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

Inspector.xaml{ThemeResource}を使用してStyleを含んでおり、間違っていたところだ表示されます。最終的な解決策/回避策は、を含み、Themes.xamlの参照をInspector.xamlに含むことであった。

誰かがこの解決策の背後にある正確な推論を説明することができれば、私は多くの義務があります。

+0

ありがとう、私の日を救った – Jasper

1

エラーメッセージから、XAMLコンパイラはネストされたResourceDictionariesのソースプロパティを変換できませんでした。最も簡単かつ最速の回避策はApp.Xaml.csで、ネストされたResourceDictionariesを追加することです:

protected override void OnLaunched(LaunchActivatedEventArgs e) 
{ 
    ... 
    var applicationMergedDics = Application.Current.Resources.MergedDictionaries; 
    applicationMergedDics[0].MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("ms-appx:///Styles/Shared.xaml") }); 
    applicationMergedDics[0].MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("ms-appx:///Styles/Templates.xaml") }); 
    ... 
    rootFrame.Navigate(typeof(MainPage), e.Arguments); 
} 

注:CustomControls.xamlMergedDictionariesを削除することを忘れないでください。そして、エラーはなくなります。

関連する問題