2010-07-30 13 views
8

Potrzebuję dodać kod za klasą do słownika zasobów, jak opisano w this question. (Wiem, że to nie jest dobra praktyka, ale powinien działać w oparciu o komentarze do połączonego pytanie) .I'm przedstawieniu kod z atrybutu X: Klasa:xClassNotDerivedFromElement błąd podczas dodawania kodu Behind do słownika zasobów w silverlight

XAML (oddzielny zasób słownik pliku):

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="MyNamespace.MyStandardResources"> 
    ... 
</ResourceDictionary> 

KOD:

using System.Windows; 

namespace MyNamespace 
{ 
    public partial class MyStandardResources : ResourceDictionary 
    { 
     public MyStandardResources() 
     { 
      InitializeComponent(); 
     } 

     //... 
    } 
} 

To powoduje wyjątek czasu wykonywania parsera:

Parser błąd wewnętrzny: Object pisarza xCla ssNotDerivedFromElement ". [Line: xxx Position: xxx] at System.Windows.Application.LoadComponent.

Zasoby są zawarte w App.xaml za pomocą znacznika ResourceDictionary.MergedDictionaries.

+0

Usuń kod wywoławczy, ale konstruktor z kodu i usuń wszystkie zasoby z Xaml pozostawiając pusty słownik zasobów. Czy nadal pojawia się błąd? (BTW "StandardResources" nazwa konstruktora jest literówka w prawo?) – AnthonyWJones

+0

Poprawiono literówka. Nadal dostaję błąd, używając pustego słownika klas i pustego zasobu XAML. – PanJanek

Odpowiedz

6

Czy próbujesz użyć tej ResourceDictionary jako wartości źródłowej połączonego słownika? Jeśli tak, to nie jest obsługiwane. Otrzymujesz błąd xClassNotDerivedFromElement, który jest dziwnym sposobem wskazania tego, ale oto dlaczego: wartość atrybutu Source jest tłumaczona w sposób, który odwołuje się do XAML jako XAML, a nie do klasy. Parser XAML otwiera to XAML jako działanie z czystym ładunkiem bez korzyści z jakiegokolwiek prekompilacji i nie może pogodzić klasy x: Class w tym czasie.

5

Klasa x: Class jest ograniczona dla połączonych słowników w App.xaml. Zamiast tego należy użyć klasy zdefiniowany jako kod związany z zasobami aplikacji:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Class="MyNamespace.App" 
     xmlns:view="clr-namespace:MyNamespace"> 

    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <view:MyStandardResources /> 
       .... 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 

</Application> 
+0

Dzięki! Absolutnie złote spostrzeżenia! –

0

Szkoda, że ​​tworzenie kodu z opóźnieniem do słownika zasobu teraz oznacza, że ​​nie można utworzyć ResourceDictionary używając URI do XAML.

usunąłem mój kod z opóźnieniem ponownie, ale nadal stworzył ResourceDictionary w kodzie za pomocą odpowiedź od tego question+and+answer

W zasadzie to właśnie tworzy pusty ResourceDictionary i ustawienie jego Source do XAML URI w kodzie.

Dla mnie to działało lepiej, ponieważ oznacza to, że każdy jeszcze może odwoływać się do słownika zasobów, jeśli chce, i robić to w oczekiwany sposób.

Powiązane problemy