2010-05-26 3 views
11

Я изучаю WPF и начинаю с this Учебник MSDN.Ошибка - не удается найти статический ресурс в приложении WPF

Я просто следил за учебником. Когда я закончил код согласно учебнику и попытаться запустить я получаю исключение в странице XAML, который говорит

'Обеспечить значение на „System.Windows.StaticResourceExtension“ бросил исключение. Номер строки «27» и позиция линии «55». И внутреннее исключение показывает, что ошибка «Не удается найти ресурс с именем« personItemTemplate ». Имена ресурсов чувствительны к регистру. ".

Виновник XAML ниже.

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

У меня есть необходимый шаблон внутри сетки ресурсов и поэтому добавлять его в качестве статического ресурса. Тем не менее, он бросает исключение, что шаблон данных недоступен.

ответ

28

Переместите <Grid.Resources> ... </Grid.Resources> в начало вашего определения сетки, и оно будет работать. Кажется, что необходимо определить DataTemplate перед тем, как он будет указан. Я скопировал ваш образец в приложение и подтвердил, что перемещение раздела «Ресурсы» вверх решил проблему.

+0

Да, я попробовал это случайно только сейчас и пришел сюда, чтобы обновить ответ. Но ты был первым. :-) Я принимаю ваш ответ. Любая причина, почему эта ссылка на ресурс ведет себя так? – blntechie

+0

Ну, я точно не знаю. Казалось бы, с первого взгляда, что он разбирает XAML в последовательном порядке, и поэтому он не знает, что такое «personItemTemplate», когда он впервые упоминается. Однако он знает, что ваш «ExpenseDataSource», несмотря на то, где он размещен. Итак ... Мне нужно будет отнестись к кому-то, у кого больше опыта, для лучшего объяснения. :) –

+0

Спасибо. Я просто ненавижу WPF для этого :-D –

3

Для этой ошибки существует несколько причин. Решение моей проблемы состояло в том, что я не смог добавить «InitializeComponent()»; в конструкторе приложения поэтому Xaml, содержащий ResourceDictionary, никогда не инициализировался. Отсюда ошибка «Не могу найти ...» Я не упомянул, что я использую ручную кодировку. Если вы создаете код через Visual Studio, это не требуется.

Смежные вопросы