Each dictionary entry must have an associated key error message

孤街醉人 提交于 2019-12-25 04:08:12

问题


could someone please help me to solve this problem, I think I have coded right the key required. This is a Style application dictionary test with just one Button. There are two error messages: Each dictionary entry must have an associated key, and All objects added to an IDictionary must have a Key attribute or some other type of key associated with them. Line 13 Position 14, both for MainWIndow.xaml.

There are no more code written by programmer in this project.

This is the MainWindow.xaml code:

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

And this is the App.xaml code:

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


回答1:


As pointed out in the comments, the syntax to reference a ResourceDictionary is

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

Direct content of ResourceDictionary is considered to be the dictionary's entries. This is where the missing Key error refers to. A dictionary should have look up Keys for all its entries:

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

An exception to the rule are implicit Styles (Styles that have a TargetType instead of a Key).

In your case none of the above will help, since Resources in App.xaml are treated special. They're considered Global Resources and can be referenced from everywhere. Trying to do reference them explicitly as in the first example will result in

An error occurred while finding the resource dictionary "App.xaml".

Instead change your MainWindow.xaml to

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



回答2:


Thank you Funk, thank you Mathew Jibin, your explanations lead me to find what I think is the solution, it is as follows:

Modified App.xaml to be like this:

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

And modified MainWindow deleting everything in Grid:

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

Now, everytime I create a new button it has the desired Style. Please let me know if you see any possible problem with this solution. Thanks.



来源:https://stackoverflow.com/questions/40067621/each-dictionary-entry-must-have-an-associated-key-error-message

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!