C# XAML:在引擎盖下面

C# XAML:在引擎盖下面,c#,wpf,xaml,C#,Wpf,Xaml,我必须承认,有时候XAML对我来说还是有点神秘。问题是,我总是喜欢通过C代码进行调试(在其中设置许多断点),以了解“正在发生什么”和“它是如何发生的”。但对于声明性XAML语法,这不是一个选项。我想您会同意,要使用XAML,或者准确地说,要使用/理解一些现有的XAML代码,您必须“已经知道”如何使用XAML声明。您无法通过调查应用程序代码的执行情况来了解/了解情况。因此,我非常有兴趣尽可能详细地从内到外查看XAML。我不是说“学习”XAML,我知道基本的东西。也许我可以举一些例子来说明我要找的东

我必须承认,有时候XAML对我来说还是有点神秘。问题是,我总是喜欢通过C代码进行调试(在其中设置许多断点),以了解“正在发生什么”和“它是如何发生的”。但对于声明性XAML语法,这不是一个选项。我想您会同意,要使用XAML,或者准确地说,要使用/理解一些现有的XAML代码,您必须“已经知道”如何使用XAML声明。您无法通过调查应用程序代码的执行情况来了解/了解情况。因此,我非常有兴趣尽可能详细地从内到外查看XAML。我不是说“学习”XAML,我知道基本的东西。也许我可以举一些例子来说明我要找的东西-

  • 与C代码相比,当我们在XMAL中使用对象时,对象是如何被实例化的?它们是否存储在托管堆中?与C#代码实例化对象的方式相同
  • 在为数据/命令绑定使用标记扩展语法时,如何设置属性
  • 当INotifyPropertyChanged类型的任何属性更新时,XAML语法中的绑定instatnce如何更新其自身?首先,它是如何得到通知的&由谁通知的
  • 通过定义类型化的DataTemplate,可以在运行时将viewmodel设置为视图的DataContext,如-



    它实际上是如何发生的?除了在逻辑树上搜索DataContext属性外,设置DataContext的规则有哪些
  • 如何在运行时处理/解析整个模板(DataTemplate、ControlTemplate和ItemsPanelTemplate)
  • 等等等等等等

因此,如果您是XAML方面的优秀/经验丰富/专家,您会推荐什么(链接、文章、博客帖子、书籍等)作为参考,以帮助您更清楚、更深入地了解XAML是如何“在幕后”工作的?提前感谢。

大多数原因可以解释为不要将XAML看作是一种真正的编程语言,更像是一种声明性语言。在xaml中所做的一切都可以在C#中实现,事实上这就是正在发生的事情

与C#代码相比,当我们使用对象时,对象是如何被实例化的 在圣诞节?它们是否存储在托管堆中?和C一样# 代码实例化对象

是的,因为它们只是c#对象。大多数资源都存储在休眠状态,我记得膨胀这个词。转换器或其他“直接”c#对象在需要时创建。这里很重要的一点是,这些资源通常是共享的,因此它们只会被创建一次

在为数据/命令绑定使用标记扩展语法时,如何设置属性

这同样取决于标记扩展的使用位置。以一种风格?在模板中?在像窗口这样的实例化用户控件中?通常在您实际需要它们时对其进行评估。当膨胀的样式存储在实际的资源字典中时,对它们进行评估是没有意义的。当您在对象上实际使用样式时,会对其进行计算

当INotifyPropertyChanged类型的任何属性更新时,如何更新 XAML语法中的绑定instatnce会更新自身吗?怎么 确切地说,它首先会得到通知&由谁通知

通过绑定引擎。WPF检查DataContext是否继承INotifyPropertyChanged接口,是否附加到接口提供的事件,是否侦听任何更改。如果引发这样的事件,绑定引擎将再次调用getter

它实际上是如何发生的?设置DataContext的规则是什么 而不是向上搜索DataContext属性 逻辑树

简言之:没有其他人。Datacontext只是一个继承的附加属性。如果不在子控件上重新设置它,它将接受父控件的值,直到它到达根控件为止。唯一的例外是
ContentControls
ContentPresenter
它们不会继承数据上下文,但会根据内容进行更改。因此,默认情况下,这些控件始终将内容作为其DataContext

如何在运行时处理/解析整个模板(DataTemplate、ControlTemplate和ItemsPanelTemplate)

简单地说:每次WPF找到一个非ui对象时,它都会尝试为给定类型找到一个DataTemplate。例如,在ItemsControl中:可以绑定
MyClass
的列表;除非提供显式DataTemplate或DataTemplateSelector,否则它将在资源树中向上搜索隐式样式。再次记住,这种情况在XAML中并没有发生,而是发生在由XAML生成的C#对象上

通过任何方式(目前或不久的将来)都可以进行调试吗 通过XAML代码

您认为如何调试未执行但在编译时进行评估的内容


请不要认为这是100%正确。这些年来,我收集了很多关于XAML及其用法的信息。如果您有任何更正或发现明显错误的地方。请告诉我,我们都是来学习的,我总是学习关于我使用的东西的新东西:)

你提出了一些有趣的问题,但这是一个非常广泛的问题,不太可能得到明确的答案,这使得它不适合StackOverflow。但是,XAML是组成UI的对象的序列化,这在某种程度上可能有助于您理解。当您输入
时,请不要关闭问题。试着理解所有这些要点都不是我的问题。这些仅仅代表了关于我正在寻找的参考类型的提示。我唯一的问题是最后一段中的最后一个问题-“…你有什么建议…?”很可能是:谷歌、MSDN和WPF圣经()。@DanPuzey:谢谢Dan的意见。我对那个“调试”也有同样的猜测