3

我写了简单的 XAML 文件:

<Window      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d"
             d:DesignHeight="400" d:DesignWidth="250"
             WindowStartupLocation="CenterScreen"
             ResizeMode="NoResize" Title="Окошко" Width="250" Height="400">
    <Grid>
        <!--Настраиваем сетку-->
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <!--Теперь по сетке раскидываем контролы-->
        <GroupBox x:Name="listTitle" x:FieldModifier="public" Header="Список элементов:" Margin="5"
                  Padding="5">
            <!--В объекте ListBox указываем, что источником данных для элементов
            списка следует использовать свойство DataContext родительского элемента-->
            <ListBox x:Name="listbox" x:FieldModifier="public"
                     ItemsSource="{Binding}" SelectionMode="Multiple">
                <!--Шаблон отображения элементов списка-->
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <!--Указываем, что каждый элемент следует отображать
                        в виде текста, который должен считываться из свойства "Value"-->
                        <TextBlock Text="{Binding Path=Value}"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </GroupBox>
        <GroupBox Header="Примечание:" Grid.Row="1" Margin="5" Padding="5">
            <TextBlock x:Name="txtNotes" x:FieldModifier="public" TextWrapping="Wrap"/>
        </GroupBox>
        <StackPanel Orientation="Horizontal" Grid.Row="2"
                    HorizontalAlignment="Right">
            <Button x:Name="btnAccept" x:FieldModifier="public" Margin="5"
                    Padding="5" IsDefault="True">Принять</Button>
            <Button x:Name="btnExit" x:FieldModifier="public" Margin="5"
                    Padding="5" IsCancel="True">Выход</Button>
        </StackPanel>
    </Grid>
</Window>

这是一个简单的窗口:

在此处输入图像描述

我在我的代码中解析这个:

using (io.FileStream fs = new io.FileStream(fileFullName, io.FileMode.Open)) {
    depObj = XamlReader.Load(fs) as DependencyObject;
    fs.Close();
}

它在 .NET 4.0 中运行良好,但在 .NET 3.5 SP1 中出现异常:

System.Windows.Markup.XamlParseException 发生消息=XML 命名空间“ http://schemas.microsoft.com/winfx/2006/xaml
” 中不存在属性“FieldModifier” 。行'17'位置'38'。

为什么会这样?

4

1 回答 1

4

好吧,它也不应该在 .NET 4 中工作,但显然解析器通过忽略您使用x:FieldModifier.

根据MSDN 文档,那么您还必须有一个x:Class指令。

如果 XAML 产品在任何地方使用 x:FieldModifier,则该 XAML 产品的根元素必须声明 x:Class 指令。

如果您没有声明类/代码隐藏文件并且动态加载 XAML,则使用 x:FieldModifier 毫无意义。

于 2012-12-19T17:05:15.270 回答