2011-01-18 11 views
2

したがって、私たちのStyles.xamlドキュメントでは、外部XMLを使用してスタイルの色を指定しています。私たちはこれがコーダーではない人々が私たちのアプリの見た目を変更できるようにするための抽象的なレベルを提供すると考えました。リンクされたコンテンツはリソース辞書では機能しません。

それは何か、この作品:

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:CalManv4UI" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 
    xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit" 
mc:Ignorable="d" 
> 

    <XmlDataProvider x:Key="BrandInfo" Source="/Config/BrandInfo.xml" XPath="BrandRoot" /> 

    <Style TargetType="{x:Type TextBox}"> 
    <Setter Property="Foreground" Value="{Binding Source={StaticResource BrandInfo}, XPath=//Colors/@TextBoxForeground}"/> 
     <Setter Property="Background" Value="{Binding Source={StaticResource BrandInfo}, XPath=//Colors/@TextBoxBackground}"/> 
    <Setter Property="FontSize" Value="11"/> 
    <Setter Property="FontFamily" Value="Verdana"/> 
</Style> 
</ResourceDictionary> 

をそして、これは動作し、すべてが順調ですが、私たちは、メインアプリのスタイルを再利用しますヘルパーアプリケーションのカップルを追加する必要がありました。

私はメインのアプリケーションを参照していたので、すべてのコードを調べて、スタイルを再利用することができました。しかし、私がこれを行うと、IOException "リソース 'config/brandinfo.xml'を見つけることができません。" mainAppがrefrencedされて以来、brandinfo.xmlがコピーされていることを二重に確認したので、困惑しました。

私が試みたと思う次のことは、リンクされたファイルとして使用しているので、configフォルダを作成し、リンクとして追加して、常にコンテンツコピーに設定します。これは私のcsprojファイルにこのコードを作成します

<ItemGroup> 
<Content Include="..\MainAppUI\Config\BrandInfo.xml"> 
    <Link>Config\BrandInfo.xml</Link> 
    <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
</Content> 
</ItemGroup> 

まだ動作しませんので、最後にファイルとして追加しました。これは私のcsprojファイルにこのコードを作成します。

<ItemGroup> 
<Content Include="Config\BrandInfo.xml"> 
    <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
</Content> 
</ItemGroup> 

これでうまくいきましたが、私はBrandInfoファイルを2部持っています。これは、今後の人口増加の問題です。

答えて

3

私は同じ問題を抱えていました。幸いなことに、thisに手掛かりがありました。リンクされたファイルはルートにあります。

だから、私は次の構造を持って言うことができます: MyAssembly - > MyFolderという - 辞書フォームApp.xamlをロードするには> MyDictionary.xaml

は行います

  1. MyDictionary.xamlがある場合"本当の" ファイル -

    012 -

    <ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
    <ReosurceDictionary Source="pack://application:,,,/MyAssembly;component/MyFolder/MyDictionary.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
    
  2. MyDictionary.xamlは、リンクされたファイルであれば

    <ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
    <ReosurceDictionary Source="pack://application:,,,/MyAssembly;component/MyDictionary.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
    

(注:MyFolderというのommitedさ)

警告:私は、インターネットに接続されていないマシン上でコードをテストし、スペルや構文がずれることがありますので、スニペットは、メモ帳+ +で書かれています。

+0

これは外部アセンブリからのXAMLファイルを含むように思われますが、私は緩やかなxmlファイルを扱っています。 –

+0

'pack:// sourceoforigin:'構文を使用しようとしましたが、これはテストしていません。 – XAMeLi

+0

SilverlightとWPFの間でファイルを共有するときに同じ問題が発生しました。元のファイルをWPFに移動し、リンク先のファイルをSilverlightソリューションで使用することで修正しました。 Silverlightのコンパイラは、リンクされたファイルで正しく動作するようです! (私はあなたのためのリンクを修正しました)http://learnwpf.com/post/2008/11/15/XAML-Complier-has-issues-with-linked-xaml-files.aspx – Kolky

1

私はこの問題の回避策を見つけようとしています。どんな問題がありますか?問題は、デザインモードウリに

"/UBP.Documents.RWS;component/Resources/ThirdPartyDocumentResourceDictionary.xaml" 

が、実行時に、我々はそれが自動的にこれを行うことは可能です

"/UBP.Documents.RWS;component/ThirdPartyDocumentResourceDictionary.xaml" 

のためにそれを置き換える必要があります正しいことでしょうか?そして、私は考えています: 標準のResourceDictionaryから継承したMyResourceDictionaryクラスを作成し、DesignTimeにあるかどうかに基づいて置換を行いたいと思います。

ラフのコードは次のようになります。

public class MyResourceDictionary : ResourceDictionary 
    { 

     new public Uri Source 
     { 
      get 
      { 
       return base.Source;     
      } 
      set 
      { 
       if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) 
       { 
        base.Source = value; 
       } 
       else 
       { 
        string originalString = value.OriginalString; 
        string newString = originalString.Substring(0, originalString.IndexOf(";component") + 11) + originalString.Substring(originalString.LastIndexOf("/") + 1);      
        base.Source = new Uri(newString, UriKind.Relative); 
        base.Source = value; 
       }     
      } 
     }  
    } 

XAMLは

<ResourceDictionary.MergedDictionaries> 
       <localconverters:MyResourceDictionary Source="/UBP.Documents.RWS;component/Resources/ThirdPartyDocumentResourceDictionary.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 

のように見え、ランタイムで、それは動作しますが、ないデザインモードで(デザインモードをデバッグしながら、(( 次は私が出てfuguredそれはセッターのオンラインで

base.Source = value; 

例外が発生すると、 refixが認識されない「

私は私の中に何があるか興味がある 『値』:

"markup://1/file:///D:/Svn/2.08.0016_20121116/Development/Sources/Universal/UBP.Documents.RWS/Presentation/ProbateCaseView.xaml%230//UBP.Documents.RWS;component/Resources/ThirdPartyDocumentResourceDictionary.xaml}". 

それは私が見ることになってるものではありません(なぜならウリクラスの私の基本的な知識であってもよいです) 。

リソースディクショナリ(「/UBP.Documents.RWS;component/Resources/ThirdPartyDocumentResourceDictionary.xaml」)への私のパスを除いて、この行が書かれているアプリケーションのXAMLファイルへのパスがプレフィックスです。 は、誰もが文字列

"/UBP.Documents.RWS;component/Resources/ThirdPartyDocumentResourceDictionary.xaml" 

それとも、よりエレガントなソリューションを提供できるかもしれ基づいて、私の相対URIにこのURIに変換する方法を私に説明してもらえますか?

関連する問題