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 が発生しましたメッセージ = 属性 'FieldModifier' は XML 名前空間 ' http://schemas.microsoft.com/winfx/2006/xaml
' に存在しません。行 '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 に答える