2009-06-29 57 views
1

我有自定義的類,我當前在App.xaml中實例化爲資源。我想將這些自定義對象移動到合併ResourceDictionary中,在樣式中使用它們,並使它們保持靠近它們的使用位置。 這裏有我想要的東西,隨意使用僞造的轉換器對象的例子,但它們可以是任何自定義對象...Silverlight 3 - 在合併的ResourceDictionary中創建自定義對象

的App.xaml(命名空間聲明ommitted):

<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和Not BoolToVisibility對象(以及實例化作爲我創建的自定義類的實例的其他對象)與Application.Resources一樣,它們被創建並且所有引用都按預期工作;但是,當我將它們移動到合併資源字典中時(如上面示例中所示),Silverlight應用程序加載時會出現格式錯誤的應用程序異常。

我相信這是合併資源字典中實例化對象的一個​​問題(我相信它更像是一種惰性加載方法),但我希望它仍然有效。

我非常能夠添加Style對象,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文件看起來完全一樣,在我原來的問題,使用資源字典,因爲它的根元素。
App.xaml略有不同。相反,通過使用資源字典元素和源屬性引用合併的ResourceDictionary的,我只是引用的合併類:

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

中提琴!有用。

0

通過將共享xaml的構建操作設置爲「Resource」並將其引用爲/AssemblyName;component/Shared.xaml,可以避免額外的代碼隱藏。由於大多數情況下逃脫我的原因,以這種方式引用它允許自定義對象實例化正常工作。