Исключение синтаксического анализа, возникающее из-за моего стиля

#c# #wpf #xaml #staticresource

#c# #wpf #xaml #staticresource

Вопрос:

Я создаю приложение WPF на C #, используя XAML. Я просмотрел документацию по созданию стилей для XAML.

Похоже, что он работает правильно в конструкторе, прежде чем я действительно запущу свое приложение. При запуске моего приложения я получаю исключение синтаксического анализа. Причиной этой ошибки является просмотр указанной строки и позиции <Style="{StaticResource T}" /> . Его удаление решает проблему, но для этого мне нужно выполнить встроенное Style , чего я хотел бы избежать.

Код XAML для Page решения этой проблемы приведен ниже, и я был бы признателен за любые отзывы и рекомендации по этому вопросу. Стиль, который здесь не работает, — это x:Key="T" TargetType="Border" .

 <Page x:Class="NGClient1.Screen1.BE2.WindowBe2Tablet"
      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" 
      xmlns:local="clr-namespace:NGClient1.Screen1.BE2"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800"
      Title="WindowBe2Tablet" Width="1024" Height="1280" Background="Black">

    <Grid>

        <Grid>
            <Grid.ColumnDefinitions >
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>

            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>

            <Image Source="Resources/backdrop.png" Stretch="UniformToFill" Grid.ColumnSpan="2" Grid.RowSpan="3" />

            <StackPanel Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="2" Grid.RowSpan="2" VerticalAlignment="Center" HorizontalAlignment="Center">
                <TextBlock Text="Advert Section Here" />
            </StackPanel>

            <Border Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" BorderBrush="White" BorderThickness="4" Background="Black" Margin="40, 40, 40, 40" Opacity="0.5"/> -->
            <Border Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Style="{StaticResource T}" /> <!-- Exception being thrown here, unsure why -->
            
            <StackPanel Grid.Column="0" Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Center">
                <TextBlock Text="Lower Section Left Here" />
            </StackPanel>

            <StackPanel Grid.Column="1" Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Center">
                <TextBlock Text="Lower Section Right Here" />
            </StackPanel>

        </Grid>
    </Grid>

    <Page.Resources>
    
        <Style x:Key="T" TargetType="Border" > <!-- x:Key causing exception, unsure why -->
            
            <Setter Property="BorderBrush" Value="White"/>
            <Setter Property="BorderThickness" Value="4"/>
            <Setter Property="Background" Value="Black"/>
            <Setter Property="Margin" Value="40, 40, 40, 40"/>
            <Setter Property="Opacity" Value="0.5"/>
            
        </Style>

        <Style TargetType="TextBlock">
            
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="FontSize" Value="25"/>
            <Setter Property="HorizontalAlignment" Value="Center"/>
            <Setter Property="VerticalAlignment" Value="Center"/>
            
        </Style>
        
    </Page.Resources>
</Page>
 

Комментарии:

1. Border Ссылается на стиль до его создания. Ваши ресурсы должны быть определены в верхней части страницы.

Ответ №1:

При использовании StaticResource s имеет значение порядок определения и ссылки на ресурс в XAML.

Предоставляет значение для любого атрибута свойства XAML путем поиска ссылки на уже определенный ресурс. Поведение поиска для этого ресурса аналогично поиску во время загрузки, который будет искать ресурсы, которые были ранее загружены из разметки текущей страницы XAML, а также из других источников приложения, и будет генерировать это значение ресурса в качестве значения свойства в объектах времени выполнения.

Как указано в документации для статического поиска ресурсов:

Прямые ссылки не могут быть разрешены статической ссылкой на ресурс.

В вашем случае раздел ресурсов находится внизу страницы, поэтому ресурс будет определен после первой ссылки на StaticResource него. Чтобы решить проблему, вам нужно либо переместить раздел ресурсов в позицию, прежде чем ссылаться на определенные в нем ресурсы, либо использовать DynamicResource вместо этого.

 <Border Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Style="{DynamicResource T}"/>
 

Вместо этого расширение разметки DynamicResource обрабатывает ключ, создавая выражение, и это выражение остается неоценимым до запуска приложения, после чего выражение вычисляется для предоставления значения.

Комментарии:

1. Спасибо. Я, должно быть, случайно просмотрел эти важные разделы документации. Спасибо за четкое и понятное объяснение. К счастью, теперь я это понимаю. 🙂