16

我有一個名爲「MySilverlightControls」的Silverlight控件組合件。幾個文件夾放入該程序集我有一個類從第三方供應商擴展網格列,我們稱之爲「MyImageColumn.cs」。以編程方式訪問ResourceDictionary項目

我還創建了一個名爲Generic.xaml的資源字典,它位於程序集的Themes文件夾中。在這種資源字典我已經定義了一個控件模板稱爲 MyImageColumnTemplate

<ControlTemplate x:Name="MyImageColumnTemplate" > 
    <Grid Margin="8,8,4,4" MaxHeight="32" MaxWidth="32"> 
     <Grid.Resources> 
      <localGrid:StatusColumnImageConverter x:Key="ImageContentConverter"/> 
     </Grid.Resources> 
     <Border Margin="5,5,0,0" Background="Black" Opacity="0.15" CornerRadius="5" /> 
     <Border Background="#FF6E6E6E" CornerRadius="4,4,4,4" Padding="4" Margin="0,0,5,5"> 
      <Border Background="White" CornerRadius="2,2,2,2" Padding="3"> 
       <Image Source="{Binding EditValue, Converter={StaticResource ImageContentConverter}}" Stretch="Uniform"/> 
      </Border> 
     </Border> 
    </Grid> 
</ControlTemplate> 

我的問題是:從MyImageColumn,我怎麼能編程引用/加載此控制模板,所以我可以把它分配給該列的屬性?我期望使用類似這樣的語法:

ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"]; 

但這總是返回null。當我在Reflector中加載程序集時,我看到Generic.xaml文件在那裏,資源的名稱是MySilverlightControls.g.resources,其中的路徑是themes/generic.xaml

我該如何到達此資源字典中的各個項目?

回答

30

把它解決了。

我需要:

  • 載入我的資源字典
  • 與應用程序的資源進行合併
  • 從應用程序資源

載入我的控制模板加載資源的一部分字典,我還必須註冊pack URI方案。然後我必須處理一些基於COM的瘋狂例外,因爲我的xaml存在輕微錯誤。我還必須將我的xaml移動到單獨的資源字典文件中,試圖通過generic.xaml來執行此操作,並保持拋出錯誤(即使xaml沒有問題,並且可以使用新創建的資源字典文件正常加載)。因此,簡化了下來,這是代碼:

if (!UriParser.IsKnownScheme("pack")) 
    UriParser.Register(new GenericUriParser(GenericUriParserOptions.GenericAuthority), "pack", -1); 

ResourceDictionary dict = new ResourceDictionary(); 
Uri uri = new Uri("/MySilverlightControls;component/themes/Dictionary1.xaml", UriKind.Relative); 
dict.Source = uri; 
Application.Current.Resources.MergedDictionaries.Add(dict); 
ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"]; 

我已經張貼在this blog post該解決方案的全部細節。

+2

爲我節省了很多時間。非常感謝博客文章。做得好。 – captonssj 2013-05-07 23:04:56

+2

只需記下@slugster爲什麼做了前兩行。 'pack' Uri樣式默認沒有加載和註冊,導致'Uri uri = new Uri(任何包Uri樣式的字符串);'拋出一個異常。在允許自己使用'pack' Uri之前,這種獲得註冊的方式對你的代碼的干擾要比等到你創建第一個'FrameworkElement'之後要少。 – 2015-10-08 22:39:56