每个字典条目必须具有关联的密钥错误消息

时间:2016-10-16 06:40:11

标签: wpf app.xaml

有人可以帮我解决这个问题,我想我已经编码了所需的密钥。这是一个只有一个Button的Style应用程序字典测试。有两个错误消息:每个字典条目必须具有关联的键,添加到IDictionary的所有对象必须具有Key属性或与其关联的其他类型的键。第13行位置14,均为MainWIndow.xaml。

此项目中没有程序员编写的代码。

这是MainWindow.xaml代码:

autoUpdatingCode

这是App.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>

2 个答案:

答案 0 :(得分:1)

正如评论中所指出的,引用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的样式。)

在您的情况下,上述任何一项都不会有所帮助,因为 App.xaml 中的Resources会受到特殊处理。它们被认为是全球资源,可以从任何地方引用。尝试在第一个示例中明确引用它们将导致

  

查找资源字典“App.xaml”时发生错误。

而是将 MainWindow.xaml 更改为

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

答案 1 :(得分:0)

谢谢Funk,谢谢Mathew Jibin,你的解释引导我找到我认为的解决方案,它如下:

将App.xaml修改为:

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

修改后的MainWindow删除Grid中的所有内容:

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

现在,每当我创建一个新按钮时,它都具有所需的样式。如果您发现此解决方案可能存在任何问题,请与我们联系。感谢。