2010-05-26 12 views
11

Estoy aprendiendo WPF y comencé con this MSDN tutorial.Error - No se puede encontrar recurso estático en una aplicación WPF

Estaba siguiendo el tutorial. Cuando terminé el código de acuerdo con el tutorial y trato de correr consigo una excepción en una página XAML que dice

'proporcionan un valor de 'System.Windows.StaticResourceExtension' produjo una excepción.' El número de línea '27' y la posición de línea '55'. ". Y la excepción interna revela que el error es" No se puede encontrar el recurso llamado 'personItemTemplate'. nombres de recursos entre mayúsculas y minúsculas. ".

El XAML culpable es abajo.

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

Tengo la plantilla requerida dentro de los recursos Grid y así agregarlo como un recurso estático. Aún así, se lanza la excepción que el datatemplate no está disponible.

Respuesta

28

Mueva el <Grid.Resources> ... </Grid.Resources> a la parte superior de la definición de su cuadrícula y funcionará. Parece que DataTemplate debe definirse antes de que se haga referencia. Copié su muestra en una aplicación y confirmé que moviendo la sección de Recursos hacia arriba resuelve el problema.

+0

Sí, lo intenté al azar y vine aquí para actualizar la respuesta. Pero tú primero. :-) Estoy aceptando tu respuesta. ¿Alguna razón por la cual la referencia del recurso se comporta así? – blntechie

+0

Bueno, no estoy seguro. Parecería a primera vista que analiza el XAML en orden secuencial, por lo que no sabe qué es 'personItemTemplate' cuando se hace referencia por primera vez. Sin embargo, sí sabe qué es su 'ExpenseDataSource' a pesar de dónde se coloca. Entonces ... tendré que ceder ante alguien con más experiencia para una mejor explicación. :) –

+0

Gracias. Odio WPF por esto :-D –

3

Existen varias razones para este error. La solución a mi propuesta fue que no pude agregar un "InitializeComponent();" en el constructor de la aplicación, por lo tanto, el Xaml que contiene ResourceDictionary nunca se inicializó. De ahí el error "No se puede encontrar ..." No mencioné que estoy codificando a mano. Si genera código a través de Visual Studio, esto no es necesario.

Cuestiones relacionadas