由于我的样式而发生解析异常
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】:
使用StaticResource
s 时,在 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”而终止应用程序,原因:“意外的启动状态”