2011-10-22 37 views
5

我正在處理一個項目,其中XAML(和一些關聯的IronPython代碼)的鬆散位將由客戶端應用程序動態加載和執行。客戶端將使用自定義的WCF服務(以及一些本地緩存)來檢索XAML,後臺腳本和相關資源(圖標,圖像等)。註冊自定義URI協議以處理來自XAML的自定義資源加載

我想註冊一個自定義的URI協議/方案,使其更容易爲動態包的開發商參考他們的資源,如下所示:

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 

       <ResourceDictionary Source="custom://MyPackage/Icons.xaml" /> 
       <ResourceDictionary Source="custom://MyPackage/Styles.xaml" /> 
       <!--      ^^^^^^       --> 

      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </UserControl.Resources> 
</UserControl> 

至於我可以告訴大家,我可以派生出一個自定義UriParserregister it,但這似乎只是戰鬥的一半。剩下的工作是提供解析自定義URI所需的任何組件,並檢索所需的內容。

是否有可能在WPF中提供或覆蓋功能,以便在遇到我的自定義URI之一時允許它調用我的自定義數據服務?或者,如果這是不可能的,有沒有其他的選擇?

回答

3

根據我的理解,您需要創建一個派生自WebRequest的類並將其註冊爲WebRequest.RegisterPrefix

+0

我知道這一定很容易。謝謝! –

0

作爲替代方案,我想知道是否可以創建一個繼承自ResourceDictionary的新類(因爲它不是sealed)併爲Source提供new定義。這會讓你攔截設置爲Source的值,然後根據自定義UriParser運行該值。這也可以讓您輕鬆更新ResourceDictionary的結果。

+1

它可以工作,如果源是虛擬的,因爲你可以覆蓋它。但是如果你使用'new',它只是隱藏基類屬性並聲明一個新的屬性。 WPF將永遠不會使用這個屬性,因爲它不知道它 –

+0

正確 - 我認爲WPF不需要使用Source,如果新定義具有使用新資源更新ResourceDictionary所需的所有邏輯。 –