c# - XAML:引擎盖下

标签 c# wpf xaml

好吧,我必须承认,有时 XAML 对我来说还是有点神秘。问题是,我总是喜欢调试 C# 代码(在其中设置很多断点)以了解“正在发生什么”和“它是如何发生的”。但是对于声明性 XAML 语法,这不是一种选择。我想您会同意,要使用 XAML,或者更准确地说,要使用/理解一些现有的 XAML 代码,您必须“已经知道”XAML 声明是如何工作的。您根本无法通过调查应用程序代码的执行来了解/学习东西。因此,我非常有兴趣尽可能详细地彻底了解 XAML。我不是在谈论“学习”XAML,我知道基本的东西。也许我可以提供一些例子来阐明我正在寻找的东西 -

  • 与 C# 代码相比,当我们在 XMAL 中使用对象时如何实例化对象?它们存储在托管堆中吗?与 C# 代码实例化对象的方式相同吗?
  • 在使用数据/命令绑定(bind)的标记扩展语法时如何设置属性?
  • 当更新 INotifyPropertyChanged 类型的任何属性时,XAML 语法中的绑定(bind)实例如何更新自身?一开始它究竟是如何得到通知的,由谁通知的?
  • 通过定义类型化的 DataTemplate,可以在运行时将 View 模型设置为 View 的 DataContext,例如 -
    <DataTemplate DataType="{x:Type viewmodels:AccountsViewModel}"><br/> <views:Accounts/><br/> </DataTemplate>
    它实际上是如何发生的?除了在逻辑树向上搜索 DataContext 属性之外,设置 DataContext 的规则是什么?
  • 如何在运行时处理/解析整个模板内容(DataTemplate、ControlTemplate 和 ItemsPanelTemplate)。
  • 等等等等等

因此,如果您是 XAML 方面的好手/经验丰富/专家,您会推荐什么(链接、文章、博文、书籍等)作为引用,以帮助更清楚、更深入地了解 XAML 的“幕后”工作原理?提前致谢。

最佳答案

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

Compared to C# code how an object gets instantiated when we use them in XMAL? Are they stored in managed heap? Same way as C# code-instantiated objects?

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

How the properties get set while using Mark-Up Extension syntax for Data/Command Binding?

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

When any property of an INotifyPropertyChanged type gets updated, how the Binding instatnce inside the XAML syntax updates the itself? How exactly it gets notified it at the first place, & by whom?

由绑定(bind)引擎。 WPF 检查您的 DataContext 是否继承了 INotifyPropertyChanged 接口(interface),附加到接口(interface)提供的事件并监听任何更改。如果引发此类事件,绑定(bind)引擎将再次调用 getter。

How does it happen actually? What are the rules for setting DataContext other than searching for the DataContext property upward the logical tree?

简而言之:没有其他。 Datacontext 只是一个继承的附加属性。如果您不在子控件上重新设置它,它将采用父控件的值,直到它到达根。唯一的异常(exception)是 ContentControlsContentPresenter 它们不会继承 DataContext 但会根据内容更改它们。因此,这些控件始终默认将 Content 作为其 DataContext。

How the whole template things (DataTemplate, ControlTemplate & ItemsPanelTemplate) are treated/resolved at run time.

简单地说:每次 WPF 找到一个非 ui 对象时,它都会尝试为给定类型找到一个 DataTemplate。例如,在 ItemsControl 中:您可以绑定(bind) MyClass 列表;除非您提供明确的 DataTemplate 或 DataTemplateSelector,否则它将向上搜索资源树以寻找隐式样式。再次记住,这已经不会发生在 XAML 中,而是发生在从 xaml 生成的 C# 对象上。

And is it by any means possible (at present or near future) to debug through XAML code?

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

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

关于c# - XAML:引擎盖下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11792376/

相关文章:

c# - 如何使用 C# 代码 LINQ 将多级 XML 扁平化为单级 XML

c# - WPF - 动态重新排列控件层次结构

c# - 使用类型填充组合框

c# - 在 Xamarin 表单的 XAML 中包含按钮时如何修复此异常?

c# - 连接到维基百科 API 的 WebRequest

c# - 从 DbContext 检索 DbSet<T> 的通用方法

c# - 在 C# 项目中自动包含文件

c# - 将数据添加到 DataGrid 中的特定列

c# - 您如何让 XAML 元素缩放以适合其容器?

xaml - 如果 ListView 中的数据为空,则隐藏行