2016-10-16 1 views
0

Может кто-то, пожалуйста, помогите мне решить эту проблему, я думаю, что я правильно закодировал необходимый ключ. Это тест словаря приложения стиля с помощью только одной кнопки. Существует два сообщения об ошибках: каждая запись словаря должна иметь связанный ключ, а все объекты, добавленные в IDictionary, должны иметь атрибут Key или какой-либо другой тип связанного с ними ключа. Строка 13 Позиция 14, как для MainWIndow.xaml.Каждая запись в словаре должна иметь связанное с ней сообщение об ошибке

В этом проекте больше нет кода, написанного программистом.

Это код MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:WpfApplication1" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary Source="App.xaml" /> This is the offending line 
    </ResourceDictionary> 
</Window.Resources> 
<Grid> 
    <Button Style="{StaticResource algo}" /> 
</Grid> 

И это код App.xaml:

<Application x:Class="WpfApplication1.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication1" 
     StartupUri="MainWindow.xaml"> 
<Application.Resources> 
     <Style x:Key="algo" TargetType="{x:Type Button}"> 
      <Setter Property="Background" Value="Red" /> 
     </Style> 
</Application.Resources> 

+0

Оскорбительная строка должна находиться внутри 'ResourceDictionary.MergedDictionaries'. В противном случае будет обработана запись внутри словаря. [Документация] (https://msdn.microsoft.com/en-us/library/system.windows.resourcedictionary.mergeddictionaries (v = vs.110).aspx) –

ответ

0

Спасибо Funk, спасибо Mathew Jibin, ваши объяснения привели меня, чтобы найти то, что я думаю, что это решение, он выглядит следующим образом:

модифицированный App.xaml быть таким:

<Application.Resources> 
     <Style TargetType="Button"> 
      <Setter Property="Background" Value="Red" /> 
     </Style> 
    </Application.Resources> 

и модифицированный Ма inWindow удалить все в сетке:

... 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
    </Grid> 

Теперь, каждый раз, когда я создаю новую кнопку она имеет нужный стиль. Пожалуйста, дайте мне знать, если вы видите какие-либо возможные проблемы с этим решением. Благодарю.

+0

Правильно, если вы хотите, чтобы все экземпляры 'Control' были затронуты, тогда подразумевается неявный стиль (например, ваш). В противном случае вы придадите стилю 'Key' и ссылаетесь на него в' Control'. – Funk

+0

@Funk, спасибо. – Phantom719

1

Как было отмечено в комментариях, синтаксис для ссылки a ResourceDictionary:

<Window.Resources> 
    <ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="myresourcedictionary.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 

Непосредственный контент ResourceDictionary считается записями словаря. Здесь упоминается ошибка Key. Словарь должен искать ключи для всех своих записей:

<Window.Resources> 
    <ResourceDictionary> 
     <conv:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" /> 
     <conv:BoolToCollapsedConverter x:Key="BoolToCollapsedConverter" /> 
     ... 
    </ResourceDictionary> 
</Window.Resources> 

Исключением из этого правила являются implicit Styles (стили, которые имеют TargetType вместо Key).

В вашем случае ни одно из вышеуказанных вопросов не поможет, поскольку Resources в App.xaml обрабатываются специальными. Они считаются Глобальными ресурсами и на них можно ссылаться везде. Попытка сделать ссылку на них явно, как в первом примере приведет к

Произошла ошибка при поиске ресурсного словаря «App.xaml».

Вместо изменить MainWindow.xaml к

<Window x:Class="WpfApplication1.MainWindow" 
    ... 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Button Style="{StaticResource algo}" /> 
</Grid> 

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

  • Нет связанных вопросов^_^