银光错误:AG_E_UNKNOWN_ERROR

4
当我运行我的Silverlight项目时,出现了一个AG_E_UNKNOWN_ERROR错误。该项目是从WPF移植而来的,从网上收集到的信息来看,我认为这可能与我的XAML中的某些无效内容有关。 编辑:C#控件源代码可在此处找到:SilverlightCalendar/Controls 这是我的应用程序的通用.xaml文件,其中包含样式。
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:c="clr-namespace:SilverlightCalendar.Controls">

    <Style TargetType="{c:CalendarTimeslotItem}">
        <Setter Property="Content" Value="{Binding}" />
        <Setter Property="Background" Value="White" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{c:CalendarTimeslotItem}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="#A5BFE1"
                            BorderThickness="0,0.5,0,0.5"
                            x:Name="bd"
                            Height="22">
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style TargetType="{c:CalendarLedgerItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{c:CalendarLedgerItem}">
                    <Border Background="#E3EFFF"
                            BorderBrush="#6593CF"
                            BorderThickness="0,0,1,1"
                            Height="44" Width="50">
                        <StackPanel Orientation="Horizontal" 
                                    VerticalAlignment="Center" 
                                    HorizontalAlignment="Center">
                            <TextBlock Text="{TemplateBinding TimeslotA}" 
                                       Foreground="#9493CF" FontSize="16" Margin="0,3,0,0"/>
                            <TextBlock Text="{TemplateBinding TimeslotB}" 
                                       Foreground="#9493CF"  Margin="1.5,0,0,0"/>
                        </StackPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style TargetType="{c:CalendarDay}">
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <c:TimeslotPanel />
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{c:CalendarDay}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <Grid>
                            <StackPanel x:Name="PART_CalendarTimeslots" />
                            <ItemsPresenter />
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style TargetType="{c:CalendarLedger}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{c:CalendarLedger}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <StackPanel x:Name="PART_CalendarLedgerItems" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style TargetType="{c:Calendar}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{c:Calendar}">
                    <Border Background="#E3EFFF"
                            BorderBrush="#6593CF"
                            BorderThickness="2,2,2,2">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="50" />
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*" />
                            </Grid.RowDefinitions>
                            <Border BorderBrush="#6593CF" BorderThickness="0,0,0,1" 
                                    Grid.Column="0" Grid.Row="1" />
                            <Border BorderBrush="#6593CF" BorderThickness="0,0,0,1" 
                                    Grid.Column="1" Grid.Row="1" />
                            <ScrollViewer Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="50" />
                                        <ColumnDefinition Width="*" />
                                    </Grid.ColumnDefinitions>

                                    <c:CalendarLedger Grid.Column="0" />
                                    <c:CalendarDay Grid.Column="1" x:Name="PART_CalendarDay" />
                                </Grid>
                            </ScrollViewer>
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style TargetType="{c:CalendarAppointmentItem}">
        <Setter Property="StartTime" Value="{Binding StartTime}" />
        <Setter Property="EndTime" Value="{Binding EndTime}" />
        <Setter Property="Width" Value="{Binding ActualWidth, ElementName=CalendarTimeslots}" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{c:CalendarAppointmentItem}">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="300" />
                            <ColumnDefinition Width="300" />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <Border Grid.Row="0" 
                                Grid.Column="{Binding Column}" 
                                Grid.ColumnSpan="{Binding ColumnSpan}"
                                CornerRadius="4,4,4,4" 
                                BorderThickness="1,1,1,1" 
                                BorderBrush="#5D8CC9" 
                                Background="{Binding Background}"
                                Margin="1,1,5,1" 
                                Padding="5,5,5,5">
                            <Border.Effect>
                                <DropShadowEffect Opacity="0.5" />
                            </Border.Effect>
                            <TextBlock 
                                IsHitTestVisible="False"
                                Foreground="{Binding Foreground}"
                                VerticalAlignment="Top"
                                MaxHeight="20"
                                LineHeight="20"
                                FontFamily="Segoe UI" 
                                FontSize="12.75" 
                                FontWeight="DemiBold"
                                FontStretch="Medium"
                                TextWrapping="WrapWithOverflow"
                                Text="{Binding Subject}" />                            
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

如果你调试这个应用程序,它会显示错误发生的行号吗?不要看HTML输出,它通常没有什么帮助。 - Anvaka
6个回答

3

最近调试了一堆这样的问题。当我看不到问题时,我会注释掉大量XAML代码,直到我不再收到错误提示,然后取消注释部分代码,直到找到引起异常的地方。

编辑:首先在TargetType="{c:CalendarTimeslotItem}"中去掉花括号。我刚试过,这样会导致异常。只需使用TargetType="c:CalendarTimeslotItem"即可。


非常好的调试提示,Alan。你甚至可以在这里应用二分查找 :)。 - Anvaka
你可以轻松地确定问题是否在XAML中(我猜是这样的):只需注释掉XAML中的所有内容,看看是否会出现一些“正常”的异常,而不是那些AG_E_UNKNOWN_ERROR。 - Alan Mendelevich

2

配置系统在抛出异常时中断。

  1. 在Visual Studio中选择调试菜单,然后选择异常...

  2. 异常对话框中,勾选常见语言运行时异常旁边的抛出复选框。

  3. 在调试器中启动您的项目(确保启用了Silverlight调试)。

您很可能会看到一些不相关的异常被抛出(只需继续调试),但最终您应该能够看到有问题的XAML异常。检查异常以查看是否可以找出行号。如果异常是在代码后台文件中抛出的,则可以从代码后台文件推断出XAML文件。


XamlException仍然是AG_E_UNKNOWN_ERROR。 - Claus Jørgensen
准确地说:XamlParseException: AG_E_UNKNOWN_ERROR [Line: 12 Position: 53]该行号是我的用户控件的入口点,该用户控件是用C#编写并使用XAML进行样式设置的。然而,正如已经说明的那样,这些信息都是完全无用的 -.- - Claus Jørgensen
你需要查看相应的XAML文件中第12行第53个位置,以查明问题的原因。我不明白这为什么是无用的信息? - Martin Liversage
因为该代码是 <control:Calendar /> ,也就是一个入口点。用于创建子控件的每一行代码(大约有1000行)都有可能导致此问题。这个问题本质上相当于一个调试器告诉你代码错误出现在Main()函数中,祝你好运;-) - Claus Jørgensen
这正是我的答案试图解决的确切问题。我的指令是为了在读取一些深度嵌套的XAML时,尝试捕获首先捕获的异常,而不是在您的顶级窗口加载失败时在更高的级别上进行捕获。至少这是我解决类似XAML问题的策略。 - Martin Liversage
好的,如果从加载“嵌套”的XAML中没有“内部”异常,那么您可能需要像Alan Mendelevich建议的那样去做。 - Martin Liversage

1

我也曾因此错误感到沮丧,但是关于注释部分并执行以缩小范围的提示帮了很多忙。最终,我发现一个控件上有一个错误的绑定。所以如果你遇到这个问题,请确保你的XAML在继续之前是完美的。


1
我们刚遇到了同样的错误,原因是它是为 x86 构建的,而不是 Any CPU。显然这不会是每个情况,但希望它能帮助到你,因为它确实帮助了我们。

这也是我的问题所在。我碰巧看到了VS中的“输出”窗口,并看到了一个“BadImageFormatException”。那时我意识到我的其中一个Silverlight库被设置为“x86”构建,而项目的其余部分则为“任何CPU”。 - McGarnagle
我正在清理引用并优化我的解决方案,所以我将Silverlight项目的平台从Any CPU更改为x86,然后开始遇到问题,切换回来后一切正常。 - Amro

0

问题已解决(还有其他问题,但那是另一天的事情)

在我的情况下,模板中使用其他有界属性导致了这个问题。

    <Style TargetType="c:CalendarTimeslotItem">
    <!--<Setter Property="Content" Value="{Binding}" />-->
    <Setter Property="Template">

    <Style TargetType="c:CalendarAppointmentItem">
    <!--<Setter Property="StartTime" Value="{Binding StartTime}" />-->
    <!--<Setter Property="EndTime" Value="{Binding EndTime}" />-->
    <Setter Property="Template">

-2

如果你仔细看,通常该错误会有一个行号,它与XAML中的行相关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接