由于我的样式而发生解析异常

Posted

技术标签:

【中文标题】由于我的样式而发生解析异常【英文标题】:Parse Exception occurring due to my Styling 【发布时间】:2022-01-12 09:47:20 【问题描述】:

我正在使用 XAML 在 C# 中创建 WPF 应用程序。我已经查看了documentation of creating Styles for XAML。

在我实际运行我的应用程序之前,它看起来在设计器中正常工作。在运行我的应用程序时,我收到一个解析异常。查看指示的行和位置,<Style="StaticResource T" /> 是导致此错误的原因。删除它可以解决问题,但这需要我做一个我想避免的内联 Style

Page 遇到此问题的 XAML 代码如下所示,如果您对此问题提供任何反馈和指导,我将不胜感激。在这里不起作用的样式是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>

【问题讨论】:

Border 在样式创建之前引用它。您的资源需要在页面顶部定义。 【参考方案1】:

使用StaticResources 时,在 XAML 中定义和引用资源的顺序很重要。

通过查找对已定义资源的引用,为任何 XAML 属性属性提供值。该资源的查找行为类似于 加载时查找,它将查找先前从当前 XAML 页面的标记以及其他应用程序源加载的资源,并将生成该资源值作为运行时对象中的属性值。

如static resource lookup 的文档中所述:

静态资源引用无法解析前向引用。

在您的情况下,资源部分位于页面底部,因此资源将在首次通过StaticResource 引用后定义。为了解决此问题,您必须将资源部分移动到在其中定义的资源被引用之前的位置,或者改用DynamicResource

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

DynamicResource 标记扩展通过创建表达式来处理键,并且该表达式保持在应用程序运行之前保持未计算,此时表达式被计算以提供值

【讨论】:

谢谢。我必须偶然查看文档的那些重要部分。感谢您清晰而直接的解释。幸运的是,我现在明白了。 :)

以上是关于由于我的样式而发生解析异常的主要内容,如果未能解决你的问题,请参考以下文章

由于未捕获的异常“NSGenericException”而终止应用程序,原因:“*** Collection <CALayerArray: 0x66522e0> 在枚举时发生了突变

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“意外的启动状态”

Xcode异常解释

js 捕获异常和抛出异常

由于使用 AWS iOS 开发工具包的未捕获异常“NSInvalidArgumentException”而终止应用程序

发生异常:ModuleNotFoundError 没有名为“colorama”的模块