2010-05-26 13 views
11

Uczę się WPF i rozpocząłem z samouczkiem MSDN z this.- Nie można znaleźć statycznego zasobu w aplikacji WPF

Właśnie korzystałem z samouczka. Kiedy skończyłem kod zgodnie z samouczka i spróbuj uruchomić otrzymuję wyjątek strony XAML, który mówi

"Podaj wartość na«System.Windows.StaticResourceExtension»zwrócił wyjątek. Numer linii "27" i pozycja linii "55". "I wewnętrzny wyjątek pokazuje, że błąd to" Nie można znaleźć zasobu o nazwie "personItemTemplate". Nazwy zasobów jest wielkość liter. ".

Sprawca XAML jest poniżej.

<Page x:Class="ExpenseIt.ExpenseItHome" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="321" d:DesignWidth="532" 
    Title="ExpenseIt - Home"> 

    <Grid Margin="10,0,10,10"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="230" /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <Label Grid.Column="1" Style="{StaticResource headerTextStyle}">View Expense Report</Label> 
     <!-- Resource List Label--> 
     <Border Grid.Column="1" Grid.Row="1" Style="{StaticResource listHeaderStyle}"> 
      <Label VerticalAlignment="Center" Foreground="White" FontWeight="Bold">Names</Label> 
     </Border> 
     <!-- Resource List--> 
     <ListBox Name="peopleListBox" Grid.Column="1" Grid.Row="2" 
     ItemsSource="{Binding Source={StaticResource ExpenseDataSource}, XPath=Person}" 
     ItemTemplate="{StaticResource personItemTemplate}"> 
     </ListBox> 

     <!-- View button --> 
     <Button Grid.Column="1" Grid.Row="3" Click="Button_Click" Style="{StaticResource buttonStyle}">View</Button> 

     <!-- Set Background Image--> 
     <Grid.Background> 
      <ImageBrush ImageSource="watermark.png" /> 
     </Grid.Background> 
     <Grid.Resources> 

      <!-- Expense Report Data --> 
      <XmlDataProvider x:Key="ExpenseDataSource" XPath="Expenses"> 
       <x:XData> 
        <Expenses xmlns=""> 
         <Person Name="TommyVance" Department="Legal"> 
          <Expense ExpenseType="Lunch" ExpenseAmount="50" /> 
          <Expense ExpenseType="Transportation" ExpenseAmount="50" /> 
         </Person> 
         <Person Name="PhilJackson" Department="Marketing"> 
          <Expense ExpenseType="Document printing" 
     ExpenseAmount="50"/> 
          <Expense ExpenseType="Gift" ExpenseAmount="125" /> 
         </Person> 
         <Person Name="PaulBriggs" Department="Engineering"> 
          <Expense ExpenseType="Magazine subscription" 
    ExpenseAmount="50"/> 
          <Expense ExpenseType="New machine" ExpenseAmount="600" /> 
          <Expense ExpenseType="Software" ExpenseAmount="500" /> 
         </Person> 
         <Person Name="AlfredNobel" Department="Finance"> 
          <Expense ExpenseType="Dinner" ExpenseAmount="100" /> 
         </Person> 
        </Expenses> 
       </x:XData> 
      </XmlDataProvider> 
      <!-- Data Template to mention that Name should be fetched from the XMLDataProvider --> 
      <!-- Name item template --> 
      <DataTemplate x:Key="personItemTemplate"> 
       <Label Content="{Binding [email protected]}"/> 
      </DataTemplate> 
     </Grid.Resources> 
    </Grid> 
</Page> 

Mam żądany szablon wewnątrz zasobów siatki, a więc dodanie go jako zasób statycznej. Mimo to rzuca wyjątek, że datatemplate nie jest dostępny

Odpowiedz

28

Przenieś <Grid.Resources> ... </Grid.Resources> do górnej części definicji siatki i będzie działać.The DataTemplate wydaje się, że należy zdefiniować przed jej odwołanie.Odkopiowałem próbki do aplikacji i potwierdził, że przenoszenie sekcji Zasoby do góry Rozwiązać problem.

+0

Tak, próbowałem tego losowo właśnie teraz i przyszedłem tutaj, aby zaktualizować odpowiedź. Ale byłeś pierwszy. :-) Przyjmuję twoją odpowiedź. Każdy powód, dla którego odniesienie do zasobu zachowuje się w ten sposób? – blntechie

+0

Cóż, nie wiem na pewno. Na pierwszy rzut oka wydaje się, że parsuje on XAML w porządku sekwencyjnym, a więc nie wie, co to jest "personItemTemplate", kiedy jest on pierwszym odnośnikiem. Jednak nie wie, jaki jest twój "ExpenseDataSource", pomimo tego, gdzie jest umieszczony. Więc ... Będę musiał odłożyć się na kogoś z większą wiedzą, aby uzyskać lepsze wyjaśnienie. :) –

+0

Dzięki. Po prostu nienawidzę WPF do tego :-D –

3

Jest kilka przyczyn tego błędu. Rozwiązaniem mojego wniosku było to, że nie udało mi się dodać "InitializeComponent();" w konstruktorze aplikacji dlatego Xaml zawierający ResourceDictionary nigdy nie został zainicjowany. Stąd błąd "Nie mogę znaleźć ..." Nie wspomniałem, że jestem ręcznym kodem. Jeśli generujesz kod za pomocą Visual Studio, nie jest to wymagane.

Powiązane problemy