2010-05-26 15 views
11

Sto imparando WPF e ho iniziato con il tutorial MSDN this.- Impossibile trovare la risorsa statica in un'applicazione WPF

Stavo seguendo il tutorial. Quando ho finito il codice come da tutorial e provo a fare funzionare ottengo un'eccezione in una pagina XAML, che dice

'fornire un valore sul 'System.Windows.StaticResourceExtension' ha generato un'eccezione.' Numero riga "27" e posizione linea "55". "E l'eccezione interna rivela che l'errore è" Impossibile trovare la risorsa denominata "personItemTemplate". nomi delle risorse sono case sensitive. ".

Il XAML colpevole è al di sotto.

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

ho il modello richiesto all'interno delle risorse Grid e quindi aggiungerla come una risorsa statica. Eppure, getta il eccezione che il datatemplate non è disponibile

risposta

28

Sposta lo <Grid.Resources> ... </Grid.Resources> nella parte superiore della definizione della griglia e funzionerà.Il DataTemplate sembra necessario essere definito prima di fare riferimento. Ho copiato il tuo campione in un'app e ho confermato che spostando la sezione Risorse verso l'alto problema risolto.

+0

Sì, l'ho provato a caso in questo momento e sono venuto qui per aggiornare la risposta. Ma tu eri il primo :-) Sto accettando la tua risposta. Qualsiasi motivo per cui il riferimento alla risorsa si comporta in questo modo? – blntechie

+0

Beh, non lo so per certo. Sembrerebbe che analizzi l'XAML in ordine sequenziale, e quindi non sa che cosa è "personItemTemplate" quando viene fatto il primo riferimento. Tuttavia, sa cosa è la tua 'ExpenseDataSource', nonostante la posizione in cui è posizionata. Quindi ... dovrò rimandare a qualcuno con più esperienza per una spiegazione migliore. :) –

+0

Grazie. Odio solo WPF per questo :-D –

3

Ci sono diversi motivi per questo errore. La soluzione al mio problema era che non sono riuscito ad aggiungere un "InitializeComponent();" nel costruttore dell'applicazione, quindi, Xaml contenente il ResourceDictionary non è mai stato inizializzato. Da qui l'errore "Impossibile trovare ..." Ho omesso di menzionare che sto codificando a mano. Se si genera codice tramite Visual Studio, questo non è richiesto.

Problemi correlati