更新时间:2023-02-16 17:45:09
我发现可以引用我的记录器。例如,如果我的主窗口局部类看起来像这样……
I figured out that I can reference my logger. For example, if my main window partial class looks like this...
namespace EventSetterNull_SO_41604891_2670182
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
...然后我可以像这样引用它。 ..
...then I can reference it like this...
((EventSetterNull_SO_41604891_2670182.MainWindow)System.Windows.Application.Current.MainWindow)
所以,我的断点就像...
So, my breakpoint is like...
然后,我可以在例如System.Windows.Markup.WpfXamlLoader.TransformNodes中设置断点,将xamlReader传递给我的记录器,然后注销解析器从中生成的节点结构
Then, I can set breakpoints in, for example, System.Windows.Markup.WpfXamlLoader.TransformNodes, pass the xamlReader to my logger, and log out the node structure that the parser generates from the baml.
<Window x:Class="EventSetterNull_SO_41604891_2670182.BuildInXaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:EventSetterNull_SO_41604891_2670182"
mc:Ignorable="d"
Title="BuildInXaml" Height="350" Width="525">
<Window.Resources>
<SetterBaseCollection x:Key="ButtonStyleSetters">
<Setter Property="FrameworkElement.Height" Value="30"></Setter>
</SetterBaseCollection>
</Window.Resources>
<Button Name="Button1"
local:Behaviours.StyleSetters="{StaticResource ButtonStyleSetters}" />
"Line: 6 NamespaceDeclaration http://schemas.microsoft.com/winfx/2006/xaml/presentation"
"Line: 6 NamespaceDeclaration http://schemas.microsoft.com/winfx/2006/xaml"
"Line: 6 NamespaceDeclaration http://schemas.microsoft.com/expression/blend/2008"
"Line: 6 NamespaceDeclaration http://schemas.openxmlformats.org/markup-compatibility/2006"
"Line: 6 NamespaceDeclaration clr-namespace:EventSetterNull_SO_41604891_2670182;assembly=EventSetterNull-SO-41604891-2670182"
"Line: 6 StartObject BuildInXaml"
"Line: 6 StartMember Title"
"Line: 6 Value BuildInXaml"
"Line: 6 EndMember "
"Line: 8 StartMember Height"
"Line: 8 Value System.Windows.Baml2006.TypeConverterMarkupExtension"
"Line: 8 EndMember "
"Line: 8 StartMember Width"
"Line: 8 Value System.Windows.Baml2006.TypeConverterMarkupExtension"
"Line: 8 EndMember "
"Line: 8 StartMember Resources"
"Line: 9 GetObject System.Windows.Baml2006.Baml2006SchemaContext"
"Line: 9 StartMember DeferrableContent"
"Line: 9 Value System.IO.MemoryStream"
"Line: 9 EndMember "
"Line: 9 EndObject "
"Line: 15 EndMember "
"Line: 17 StartMember Content"
"Line: 17 StartObject Button"
"Line: 17 StartMember ConnectionId"
"Line: 17 Value 1"
"Line: 17 EndMember "
"Line: 0 StartMember Name"
"Line: 0 Value Button1"
"Line: 0 EndMember "
"Line: 17 StartMember StyleSetters"
"Line: 17 Value System.Windows.StaticResourceExtension"
"Line: 17 EndMember "
"Line: 10 StartObject SetterBaseCollection"
"Line: 10 StartMember _Items"
"Line: 11 StartObject Setter"
"Line: 11 StartMember Property"
"Line: 11 Value Height"
"Line: 11 EndMember "
"Line: 11 StartMember Value"
"Line: 11 Value 30"
"Line: 11 EndMember "
"Line: 11 EndObject "
"Line: 11 EndMember "
"Line: 11 EndObject "
"Line: 18 EndObject "
"Line: 18 EndMember "
"Line: 18 EndObject "
所以,我可以确切地看到wpf如何看到xaml,如果拧紧了它就很方便...
So, I can see exactly how wpf sees the xaml, which is handy if it screws up...
<Window x:Class="EventSetterNull_SO_41604891_2670182.BuildInXaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:EventSetterNull_SO_41604891_2670182"
mc:Ignorable="d"
Title="BuildInXaml" Height="350" Width="525">
<Window.Resources>
<SetterBaseCollection x:Key="ButtonStyleSetters">
<Setter Property="FrameworkElement.Height" Value="30"></Setter>
<EventSetter Event="ButtonBase.Click" Handler="StyleClick"
HandledEventsToo="False" />
</SetterBaseCollection>
</Window.Resources>
<Button Name="Button1"
local:Behaviours.StyleSetters="{StaticResource ButtonStyleSetters}" />
"Line: 6 NamespaceDeclaration http://schemas.microsoft.com/winfx/2006/xaml/presentation"
"Line: 6 NamespaceDeclaration http://schemas.microsoft.com/winfx/2006/xaml"
"Line: 6 NamespaceDeclaration http://schemas.microsoft.com/expression/blend/2008"
"Line: 6 NamespaceDeclaration http://schemas.openxmlformats.org/markup-compatibility/2006"
"Line: 6 NamespaceDeclaration clr-namespace:EventSetterNull_SO_41604891_2670182;assembly=EventSetterNull-SO-41604891-2670182"
"Line: 6 StartObject BuildInXaml"
"Line: 6 StartMember Title"
"Line: 6 Value BuildInXaml"
"Line: 6 EndMember "
"Line: 8 StartMember Height"
"Line: 8 Value System.Windows.Baml2006.TypeConverterMarkupExtension"
"Line: 8 EndMember "
"Line: 8 StartMember Width"
"Line: 8 Value System.Windows.Baml2006.TypeConverterMarkupExtension"
"Line: 8 EndMember "
"Line: 8 StartMember Resources"
"Line: 9 GetObject System.Windows.Baml2006.Baml2006SchemaContext"
"Line: 9 StartMember DeferrableContent"
"Line: 9 Value System.IO.MemoryStream"
"Line: 9 EndMember "
"Line: 9 EndObject "
"Line: 15 EndMember "
"Line: 17 StartMember Content"
"Line: 17 StartObject Button"
"Line: 17 StartMember ConnectionId"
"Line: 17 Value 1"
"Line: 17 EndMember "
"Line: 0 StartMember Name"
"Line: 0 Value Button1"
"Line: 0 EndMember "
"Line: 17 StartMember StyleSetters"
"Line: 17 Value System.Windows.StaticResourceExtension"
"Line: 17 EndMember "
"Line: 10 StartObject SetterBaseCollection"
"Line: 10 StartMember _Items"
"Line: 11 StartObject Setter"
"Line: 11 StartMember Property"
"Line: 11 Value Height"
"Line: 11 EndMember "
"Line: 11 StartMember Value"
"Line: 11 Value 30"
"Line: 11 EndMember "
"Line: 11 EndObject "
"Line: 12 StartObject EventSetter"
"Line: 12 StartMember Event"
"Line: 12 Value System.Windows.Baml2006.TypeConverterMarkupExtension"
"Line: 12 EndMember "
"Line: 12 StartMember Event"
Exception thrown: 'System.Xaml.XamlDuplicateMemberException' in System.Xaml.dll
如您所见,wpf感到困惑,并在EventSetter对象中找到第二个Event成员,但不存在,并抛出错误。
这是wpf中的错误。
As you can see, wpf is getting confused and finding a second Event member in the EventSetter object, that's not there and throwing an error.
This is a bug in wpf.