WPF错误:属性元素不能位于元素的中间';的内容.它们必须在内容之前或之后

本文关键字:元素 或之后 中间 不能 属性 错误 于元素 WPF | 更新日期: 2023-09-27 18:27:36

我在ResourceDictionary中有一个MergedDictionariesDateTemplate,在添加Converter:之前一切都很好

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:WPFTry">
    <local:IsEnabledConverter x:Key="isEnabled"/>  <===== causes problem
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Styles.xaml" />
    </ResourceDictionary.MergedDictionaries>
    <DataTemplate x:Key="fileinfoTemplate" DataType="{x:Type local:MyFileInfo}">
        ... template stuff
    </DataTemplate>
</ResourceDictionary>

添加Converter行导致DataTemplate:行出现此错误

Property elements cannot be in the middle of an element's content. They must be before or after the content.

为什么会导致此错误?

请注意,如果我注释掉MergedDictionaries,代码会编译,转换器也会正常工作。

WPF错误:属性元素不能位于元素的中间';的内容.它们必须在内容之前或之后

错误告诉您问题:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:WPFTry">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Styles.xaml" />
    </ResourceDictionary.MergedDictionaries>
   <!-- Move this here -->
   <local:IsEnabledConverter x:Key="isEnabled"/>
   <DataTemplate x:Key="fileinfoTemplate" DataType="{x:Type local:MyFileInfo}">
        ... template stuff
    </DataTemplate>
</ResourceDictionary>

您试图在设置资源字典的属性之前先放置内容。错误表示"属性元素"(例如ResourceDictionary.MergedDictionaries)不能位于元素"内容"(例如数据模板/转换器等)的中间

任何带有点.的内容都必须出现在元素的顶部,因为您本质上是在XAML中设置属性。任何没有.的内容都是内容,必须出现在任何属性setter下面。

注意:这也适用于其他方式,如果您喜欢的方式,属性也可以位于所有内容下方

如果文件中存在不正确的XAML,则可能会得到相同的错误,这可能并不明显(错误消息不太具体)。

例如,以下情况将产生此错误:

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid Grid.Column="1"> <!-- delete starting this line to fix -->
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions> 
        </Grid> <!-- delete ending this line to fix -->
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid Grid.Row="1" Grid.Column="1">
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
                <Button Grid.Row="0" Content="Button1"/>
                <Button Grid.Row="1" Content="Button2"/>
                <Button Grid.Row="2" Content="Button3"/>
        </Grid>
    </Grid>

修复方法是删除上面XAML中标记的被阻止的。