2009-06-29 5 views
1

私は現在、App.xaml内でリソースとしてインスタンス化するカスタムクラスを用意しています。これらのカスタムオブジェクトをMerged ResourceDictionaryに移動して、スタイル内で使用し、使用されている場所の近くに保持したいと考えています。 はここで任意に偽のコンバータオブジェクトを使用して、私が何をしたいの例ですが、彼らは任意のカスタムオブジェクト可能性があり...Silverlight 3 - Merged ResourceDictionary内にカスタムオブジェクトを作成する

App.xaml(名前空間宣言が省略さ):

<Application.Resources> 
<ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="Merged.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 
    <Style x:Key="SomeStyle" TargetType="SomeControl"> 
     ... 
    </Style> 
    ... 

</ResourceDictionary> 

そして、その後、Merged.xaml(名前空間宣言は省略)で:

<ResourceDictionary> 
    <cvt:VisibilityToBoolConverter x:Key="BoolToVisibility" Inverted="True"/> 
    <cvt:VisibilityToBoolConverter x:Key="NotBoolToVisibility" Inverted="True" Not="True"/> 

    <Style x:Key="SomethingThatUsesVisibilityToBoolConvertersStyle" TargetType="SomeOtherControl"> 
     .... 
    </Style> 
</ResourceDictionary> 

私が見ている問題はこれです:私はBoolToVisibilityを作成していないときBoolToVisibilityオブジェクト(作成したカスタムクラスのインスタンスである他のオブジェクトをインスタンス化する)は、Application.Resourcesの一部と同じように作成され、すべての参照は期待通りに機能します。しかし、これらをMerged Resource Dictionary(上記のサンプルのとおり)に移動すると、Silverlightアプリケーションが読み込まれたときに不正なアプリケーション例外が発生します。

これは、オブジェクトがMerged Resource Dictionariesでどのように別々にインスタンス化されるかという問題であると私は考えていますが(それはレイジーロードのアプローチです)、それでも動作すると思います。

私は非常に多くのスタイルオブジェクト、DataTemplates、ControlTemplatesなどを追加することができます。しかし、Xamlを使用して名前を付けられたり、キーイングされたカスタムクラスのインスタンスを作成したい場合は、App.xamlのApplication.ResourcesとApplication.Resources/ResourceDictionaryの内部でうまく動作します。マージされた辞書に移動されるとすぐに、例外がスローされます。これは設計によるものですか?それ以外のアイデアはありますか?事前にありがとうございます...

答えて

0

私は最後にこれを回避しました。私は、Appクラスがどのようにインスタンス化され、Merged.xamlファイルでも同じことをしたページを取り出しました。私はMerged.xamlのための "コードビハインド"を持つクラスを作成しました。これはMergedと呼ばれ、ResourceDictionaryから継承されています。私はその後(App.g.csから借りて)、構築中にMerged.xamlファイルから読み込んでコンポーネントを初期化します。

Merged.xaml.cs:

public partial class Merged : ResourceDictionary 
{ 
    private bool _contentLoaded; 

    public Merged() 
    { 
     InitializeComponent(); 
    } 

    public void InitializeComponent() 
    { 
     if (_contentLoaded) 
     { 
      return; 
     } 
     _contentLoaded = true; 
     System.Windows.Application.LoadComponent(this, new System.Uri("/MySilverlightApp;component/Merged.xaml", System.UriKind.Relative)); 
    } 
} 

Merged.xamlファイルは、それのルート要素としてのResourceDictionaryを使用して、私の元の質問と全く同じように見えます。
App.xamlはちょっと違います。

<Application.Resources 
xmlns:msa="clr-namespace:MySilverlightApplication"> 
<ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <msa:Merged /> 
    </ResourceDictionary.MergedDictionaries> 
    <Style x:Key="SomeStyle" TargetType="SomeControl"> 
     ... 
    </Style> 
    ... 
</ResourceDictionary> 
</Application.Resources> 

ヴィオラ:代わりのResourceDictionary要素とソース属性を使用して、マージのResourceDictionaryを参照するの、私は単純にマージされたクラスを参照しました!できます。

0

共有xamlのビルドアクションを "リソース"に設定し、/AssemblyName;component/Shared.xamlとして参照することで、コードビハインドを避けることができます。ほとんど私が逃げる理由で、このように参照することで、カスタムオブジェクトのインスタンス化が正しく機能するようになります。