XAML:引擎盖下

时间:2012-08-03 08:50:01

标签: c# wpf xaml

嗯,我必须承认,有时XAML对我来说似乎有点神秘。问题是,我总是喜欢通过C#代码调试(在其中设置大量断点)来了解“正在发生的事情”和“它是如何发生的”。但是使用声明式XAML语法不是一种选择。我认为您同意使用XAML,或者确切地说,使用/了解一些现有的XAML代码,您必须“已经知道”XAML声明的工作原理。您无法了解/了解调查应用程序代码执行情况的事情。因此,我更感兴趣的是尽可能详细地从内到外看看XAML。我不是在谈论“学习”XAML,我知道基本的东西。也许我可以提供一些例子来澄清我正在寻找的东西 -

  • 与C#代码相比,当我们在XMAL中使用对象时,如何实例化对象?它们是否存储在托管堆中?与C#代码实例化对象相同?
  • 使用Mark-Up Extension语法进行数据/命令绑定时如何设置属性?
  • 当INotifyPropertyChanged类型的任何属性更新时,XAML语法中的Binding instatnce如何更新自身?它是如何在第一时间通知它的,&通过谁?
  • 可以通过定义Typed DataTemplate将viewmodel设置为运行时视图的DataContext,如 -
    <DataTemplate DataType="{x:Type viewmodels:AccountsViewModel}">
    <views:Accounts/>
    </DataTemplate>

     它实际上是如何发生的?除了在逻辑树上向上搜索DataContext属性之外,设置DataContext的规则是什么?
  • 如何在运行时处理/解析整个模板事物(DataTemplate,ControlTemplate&amp; ItemsPanelTemplate)。
  • 等。等等。

因此,如果您是XAML的优秀/经验/专家,您会建议什么(链接,文章,博客,书籍等)作为参考,以帮助清楚和&amp;更深入地了解XAML如何在“引擎盖下”工作?提前谢谢。

1 个答案:

答案 0 :(得分:4)

大多数可以解释为不要将XAML视为真正的编程语言,更像是声明性语言。你在xaml中所做的一切,都可以用C#制作,事实上这是最新的事情。

  

与C#代码相比,在我们使用它们时如何实例化对象   在XMAL?它们是否存储在托管堆中?与C#相同   代码实例化的对象?

是的,因为它们只是c#对象。大多数资源都存储在休眠状态,我记得某个地方充斥着这个词。转换器或其他&#34;直接&#34; c#对象在需要时创建。这里重要的是这些资源通常是共享的,因此它们只会被创建一次。

  

使用Mark-Up Extension语法进行数据/命令绑定时如何设置属性?

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

  

当INotifyPropertyChanged类型的任何属性更新时,如何更新   XAML语法中的Binding instatnce会更新自身吗?怎么样   确切地说,它在第一时间被通知,&amp;由谁?

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

  

实际上怎么样?设置DataContext的规则是什么   除了向上搜索DataContext属性   逻辑树?

简而言之:没有其他。 Datacontext只是一个继承的附加属性。如果您没有在子控件上设置它,它将获取父级所具有的值,直到它到达根目录。唯一的例外是ContentControlsContentPresenter他们不会继承DataContext,但会根据内容更改它们。因此,这些控件默认情况下始终将Content作为其DataContext。

  

如何在运行时处理/解析整个模板事物(DataTemplate,ControlTemplate&amp; ItemsPanelTemplate)。

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

  

是否可以通过任何方式(目前或将来)进行调试   通过XAML代码?

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

请不要将此视为100%正确。多年来,这就是我收集的有关XAML及其用法的信息。如果您有任何更正或发现明显错误的事情。请告诉我,我们都在这里学习,我总是学习有关我使用的东西的新内容:)

相关问题