2010-05-24 6 views
0

Si je déplace les ressources de l'application vers une ressource UserControl, everythgin exécute groovy. Je ne comprends toujours pas pourquoi.Exception ControlTemplate: "XamlParseException: impossible de trouver une ressource avec le nom/clé"


je remarquai que mon objet d'application MyApp a fait plus que de l'application, il héritera un chargé XAML pour le modèle principal et branché toute la plomberie. J'ai donc décidé de créer un contrôle utilisateur pour supprimer le modèle de l'application (en pensant qu'il pourrait y avoir un problème d'ordre pair ne permettant pas à ma ressource d'être trouvée).

namespace Module1 

type Template() as this = 
    //inherit UriUserControl("/FSSilverlightApp;component/template.xaml", "") 
    inherit UriUserControl("/FSSilverlightApp;component/templateSimple.xaml", "") 
    do 
     Application.LoadComponent(this, base.uri) 

    let siteTemplate : Grid = (this.Content :?> FrameworkElement) ? siteTemplate 
    let nav : Frame = siteTemplate ? contentFrame 


    let pages : UriUserControl array = [| 
     new Module1.Page1() :> UriUserControl ; 
     new Module1.Page2() :> UriUserControl ; 
     new Module1.Page3() :> UriUserControl ; 
     new Module1.Page4() :> UriUserControl ; 
     new Module1.Page5() :> UriUserControl ; |] 

    do 
     nav.Navigate((pages.[0] :> INamedUriProvider).Uri) |> ignore 

type MyApp() as this = 
    inherit Application() 
     do Application.LoadComponent(this, new System.Uri("/FSSilverlightApp;component/App.xaml", System.UriKind.Relative))  
    do 
     System.Windows.Browser.HtmlPage.Plugin.Focus() 
     this.RootVisual <- new Template() ; 

    // test code to check for the existance of the ControlTemplate - it exists 
     let a = Application.Current.Resources.MergedDictionaries 
     let b = a.[0] 
     let c = b.Count 
     let d : ControlTemplate = downcast c.["TransitioningFrame"] 
     () 

"/FSSilverlightApp;component/templateSimple.xaml"

<UserControl x:Class="Module1.Template" 
     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 

    <Grid HorizontalAlignment="Center" Background="White" 
     Name="siteTemplate"> 

     <StackPanel Grid.Row="3" Grid.Column="2" Name="mainPanel"> 
      <!--Template="{StaticResource TransitioningFrame}"--> 
      <navigation:Frame Name="contentFrame" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Template="{StaticResource TransitioningFrame}"/> 
     </StackPanel> 

    </Grid> 
</UserControl> 

"/FSSilverlightApp;component/App.xaml"

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      x:Class="Module1.MyApp"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="/FSSilverlightApp;component/TransitioningFrame.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

« /FSSilverlightApp;component/TransitioningFrame.xaml "

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ControlTemplate x:Key="TransitioningFrame" TargetType="navigation:Frame"> 
     <Border Background="Olive" 
       BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="5" 
       HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
       VerticalAlignment="{TemplateBinding VerticalContentAlignment}"> 
      <ContentPresenter Cursor="{TemplateBinding Cursor}" 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          Margin="{TemplateBinding Padding}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
          Content="{TemplateBinding Content}"/> 
     </Border> 
    </ControlTemplate> 
</ResourceDictionary> 

Unfortun Cela n'a pas fonctionné. Si je supprime l'attribut de modèle de l'élément navigationFrame, l'application charge et dirige la zone de contenu vers la première page du tableau de pages. Le référencement de cette ressource continue à renvoyer une erreur de ressource introuvable.


Original Post

Je l'app.xaml suivante (en utilisant Silverlight 3)

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      x:Class="Module1.MyApp"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="/FSSilverlightApp;component/TransitioningFrame.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

et modèle de contenu:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ControlTemplate x:Key="TransitioningFrame" TargetType="navigation:Frame"> 
     <Border Background="{TemplateBinding Background}" 
       BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
       VerticalAlignment="{TemplateBinding VerticalContentAlignment}"> 
      <ContentPresenter Cursor="{TemplateBinding Cursor}" 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          Margin="{TemplateBinding Padding}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
          Content="{TemplateBinding Content}"/> 
     </Border> 
    </ControlTemplate> 
</ResourceDictionary> 

Le débogueur dit le ContentTemplate est chargé correctement en ajoutant un code minimal:

Type MyApp() comme ceci = Hériter Application() do Application.LoadComponent (ce, nouveau System.Uri ("/ FSSilverlightApp; composant/App.xaml", System.UriKind.Relative))

let cc = new ContentControl() 
let mainGrid : Grid = loadXaml("MainWindow.xaml") 

do 
    this.Startup.Add(this.startup) 

    let t = Application.Current.Resources.MergedDictionaries 
    let t1 = t.[0] 
    let t2 = t1.Count 
    let t3: ControlTemplate = t1.["TransitioningFrame"] 

Avec cette ligne dans mon main.xaml

<navigation:Frame Name="contentFrame" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Template="{StaticResource TransitioningFrame}"/> 

Rendements cette exception

détails de l'erreur de page Web

Agent d'utilisateur: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4,0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E) Horodatage: Lun, 24 May 2010 23:10:15 UTC

Message: erreur non gérée dans Silverlight Application Code: 4004
Catégorie: ManagedRuntimeError
Message: System.Windows.Markup .XamlParseException: Vous ne trouvez pas une ressource avec le Nom/clé TransitioningFrame [Ligne: 86 Position: 115] à MS.Internal.XcpImports.CreateFromXaml (String xamlString, Boolean createNamescope, Boolean requireDefaultNamespace, allowEventHandlers booléennes, Boolean expandTemplatesDuringParse) à MS.Internal.XcpImports.CreateFromXaml (String xamlString, Boolean createNamescope, booléenne requireDefaultNamespace, allowEventHandlers booléennes) à System.Windows.Markup.XamlReader.Load (String xaml) à Globals.loadXaml [T] (Chaîne xam Lpath) à Module1.MyApp..ctor()

Ligne: 54 Char: 13 Code: 0 URI: file: /// C: /fsharp/FSSilverlightDemo/FSSilverlightApp/bin/Debug/SilverlightApplication2TestPage.html

Répondre

0

Hé, je force tester les modèles de contrôle de cette façon, mais je l'ai essayé de charger du contrôle lui-même. J'ai ce F # WPF contrôles personnalisés repo github,

https://github.com/fahadsuhaib/FWpfControls

Ne hésitez pas à jouer et à comprendre la façon dont il se charge. Je l'ai même fait travailler avec BLEND :).

, HUÉES vient de constater que vous utilisez Silverlight, je suis sûr de la même manière devrait fonctionner, essayer et me le faire savoir.

-Fahad