每个字典条目必须有关联的键错误信息

Each dictionary entry must have an associated key error message

有人可以帮我解决这个问题吗,我想我已经正确编码了所需的密钥。这是一个只有一个 Button 的 Style 应用程序字典测试。有两条错误消息:每个字典条目必须有一个关联的键,并且所有添加到 IDictionary 的对象都必须有一个键属性或一些其他类型的键与之关联。第 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>

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

在您的情况下,上述 none 会有所帮助,因为 App.xaml 中的 Resources 被特殊对待。它们被认为是 全球资源 并且可以从任何地方引用。尝试像第一个示例中那样显式引用它们将导致

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

而是将您的 MainWindow.xaml 更改为

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

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

现在,每次我创建一个新按钮时,它都有所需的样式。如果您发现此解决方案有任何可能的问题,请告诉我。谢谢