Исключение ControlTemplate: «XamlParseException: не удается найти ресурс с именем / ключом» - PullRequest
0 голосов
/ 25 мая 2010

Если я переместлю ресурсы приложения в ресурсы UserControl, все будет работать безупречно. Я до сих пор не понимаю, почему.


Я заметил, что мой объект приложения MyApp сделал больше, чем унаследовал от Application, он загрузил XAML для основного шаблона и подключил всю сантехнику. Поэтому я решил создать пользовательский элемент управления для удаления шаблона из приложения (полагая, что может быть проблема с четным порядком, не позволяющая найти мой ресурс).

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; компонент / 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; компонент / 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>

К сожалению, это не сработало. Если я удалю атрибут шаблона из элемента navigationFrame, приложение загрузит и перенаправит область содержимого на первую страницу в массиве страниц. Ссылка на этот ресурс продолжает вызывать ошибку «Не найдено ресурса».


Оригинальный пост

У меня есть следующий app.xaml (с использованием 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>

и шаблон контента:

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

Отладчик говорит, что contentTemplate загружен правильно, добавив минимальный код:

введите MyApp () как это = наследовать Application () do Application.LoadComponent (это, новый System.Uri ("/ FSSilverlightApp; component / 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"]

С этой строкой в ​​моем main.xaml

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

выдает это исключение

Сведения об ошибке веб-страницы

Пользовательский агент: Mozilla / 4.0 (совместимый; 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; Медиа Центр ПК 6.0; InfoPath.2; .NET4.0C; .NET4.0E) Отметка времени: понедельник, 24 мая 2010 г. 23:10:15 UTC

Сообщение: необработанная ошибка в Код приложения Silverlight: 4004
Категория: ManagedRuntimeError
Сообщение: System.Windows.Markup.XamlParseException: Не удается найти ресурс с Имя / ключ TransitioningFrame [Строка: 86 Положение: 115] в MS.Internal.XcpImports.CreateFromXaml (String xamlString, Boolean createNamescope, Логическое значение requireDefaultNamespace, Boolean allowEventHandlers, Boolean expandTemplatesDuringParse) в MS.Internal.XcpImports.CreateFromXaml (String xamlString, Boolean createNamescope, Логическое значение requireDefaultNamespace, Boolean allowEventHandlers) в System.Windows.Markup.XamlReader.Load (String xaml) на Globals.loadXaml [T] (строка xamlPath) в Module1.MyApp..ctor ()

Линия: 54 Char: 13 Код: 0 URI: Файл: /// C: /fsharp/FSSilverlightDemo/FSSilverlightApp/bin/Debug/SilverlightApplication2TestPage.html

1 Ответ

0 голосов
/ 12 мая 2011

Эй, я не проверял шаблоны управления таким образом, но я попытался загрузить его из самого элемента управления. У меня есть репозиторий F # WPF с пользовательскими элементами управления в github,

https://github.com/fahadsuhaib/FWpfControls

Не стесняйтесь поиграть и понять, как он загружается. Я даже работал с BLEND :).

WHOOPS, только что обнаружил, что вы используете Silverlight, я уверен, что тот же способ должен работать, попробуйте и дайте мне знать.

-Fahad

...