2011-10-22 9 views
5

Sto lavorando a un progetto in cui i bit liberi di XAML (e del codice IronPython associato) verranno caricati ed eseguiti dinamicamente da un'applicazione client. Il client utilizzerà un servizio WCF personalizzato (e alcune cache locali) per recuperare XAML, gli script di backup e le risorse correlate (icone, immagini, ecc.).Registrazione di un protocollo URI personalizzato per gestire il caricamento delle risorse personalizzate da XAML

Vorrei registrare una consuetudine protocollo URI/schema per rendere più facile per gli sviluppatori dei pacchetti dinamici per fare riferimento le loro risorse, come la seguente:

<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> 

Per quanto posso dire, ho può derivare una custom UriParser e register it, ma sembra solo metà della battaglia. Il lavoro rimanente consiste nel fornire qualsiasi componente necessario per risolvere l'URI personalizzato e recuperare il contenuto richiesto.

È possibile fornire o eseguire l'override della funzionalità in WPF per consentirgli di chiamare il servizio dati personalizzato quando viene rilevato uno dei miei URI personalizzati? Oppure, se questo è impossibile, c'è qualche tipo di alternativa?

risposta

3

Da quello che ho capito, è necessario creare una classe che deriva da WebRequest e registrarla con WebRequest.RegisterPrefix.

+0

Sapevo che doveva essere qualcosa di facile. Grazie! –

0

In alternativa, mi chiedo se si potrebbe creare una nuova classe che eredita da ResourceDictionary (dato che non è sealed) e fornire una definizione new per Source. Ciò consentirebbe di intercettare il valore impostato su Source e quindi eseguirlo contro il tuo UriParser personalizzato. Ciò consentirebbe anche di aggiornare facilmente lo ResourceDictionary con i risultati.

+1

Potrebbe funzionare se Source fosse virtuale perché è possibile sovrascriverlo. Ma se usi 'new', nasconde semplicemente la proprietà della classe base e ne dichiara una nuova. WPF non userà mai questa proprietà perché non ne è a conoscenza –

+0

True: stavo pensando che WPF non avrebbe avuto bisogno di usare Source se la nuova definizione avesse tutta la logica necessaria per aggiornare il ResourceDictionary con le nuove risorse. –

Problemi correlati