2009-11-25 62 views
11

我想以編程方式獲取更靜態的資源,我會在XAML:編程方式訪問Silverlight的靜態資源

<TextBlock Text="{Binding Source={StaticResource My.Text.Key}}" /> 

這工作我的靜態資源是否在TextBlock的定義,一些父元素(如用戶控件)甚至應用程序。看起來,StaticResource綁定表達式知道如何遍歷元素樹,或者元素本身。我希望做同樣的事情編程:

<UserControl x:Class="MyCustomControl" ...> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Resources.xaml"/> <!-- Sets 'My.Text.Key' to System.String 'Hello, World!' --> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </UserControl.Resources> 
</UserControl> 

public partial class MyCustomControl 
{ 
    public MyCustomControl() 
    { 
     InitializeComponent(); 
     string myCustomValue = this.Resources[MyCustomValue] as string; // myCustomValue becomes null! 
    } 
} 

即使在這個簡單的測試,我的資源似乎無法通過程序訪問。這是我嘗試真正做到的簡化版本:通過一個附有自定義動態屬性的元素(例如uiElement.Resources [key])來查找靜態資源。

+0

當我從密鑰中取出「點」(例如「MyTestKey」而不是「My.Test.Key」)時,我可以開始以編程方式查看資源。是否有關於XAML或代碼中資源命名的規則 - – Trinition 2009-11-25 16:33:19

回答

17

儘管您有相反的意見,但我懷疑「。」的用法。在您的資源密鑰中確實是問題的根源。在這種情況下,「。」沒有特別的意義,也不會影響資源的訪問方式。 (我已經嘗試過,但未能重現任何問題)。

使用{StaticResource MyName}標記擴展名和嘗試以編程方式查找資源之間有一個非常大的區別。

標記擴展會導致XamlParser查找指定的鍵 FrameworkElement屬性被分配屬性屬於。如果找不到密鑰,它會在父級FrameworkElement中查找它,並且它會一直持續,直到到達根目錄FrameworkElement。如果它仍然沒有找到,它看看應用程序的資源屬性。

在另一方面,這種代碼: -

string myCustomValue = this.Resources[MyCustomValue] as string; 

SF只是希望在單一資源屬性的用戶控件。沒有企圖在祖先或應用程序資源中尋找密鑰。它是一個簡單的字典查找。我懷疑這是真正讓你失望的原因。

話雖如此,我會說使用「。」在一個資源鍵可能不是一個好主意。 「。」在各種XAML場景中都有意義,所以在關鍵名稱中使用它也有可能使開發人員閱讀代碼時感到困惑,儘管Silverlight對此非常滿意。

+0

您的回答是我正在尋找的直接答案:XAML-parse-time資源外觀是層次結構,而程序資源訪問不是。我希望XAML語法分析器使用的層次結構邏輯也暴露給程序員使用 我的意圖是使用點是爲了更好地將資源分離爲僞代碼,但是,命名空間,這樣我的每個Prism模塊都可以定義資源並且不會碰到coll與其他模塊的概念。 – Trinition 2009-11-30 15:26:54

相關問題