【发布时间】:2021-01-30 13:31:46
【问题描述】:
XAML 项目文件被编译成 XAML 代码的二进制表示 - 二进制应用程序标记语言 (BAML)。然后将 BAML 代码作为资源嵌入到应用程序的最终程序集中 - exe 或 dll 文件。它涉及 XAML。但是,在应用程序运行时使用 C# 代码 (!) 创建的图形元素呢?
假设应用程序是一个空窗口:
<Window x:Class="WpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel x:Name="WindowStackPanel">
<Button Click="CreateButtonEvent" Content="I was created at compile time" />
</StackPanel>
</Window>
此 XAML 被编译为可执行资源。
在鼠标事件中,我添加了新按钮 - 是一个图形元素,在构建应用程序期间它没有被编译成 BAML:
private void CreateButtonEvent(object sender, RoutedEventArgs e)
{
WindowStackPanel.Children.Add(new Button() { Content = "Where was I created?" });
}
在这方面,问题是:当我在 C# 代码(而不是 XAML 代码)中创建图形项(按钮)时,在应用程序运行时,技术上会发生什么?它是在写入由 BAML 创建的共享资源,还是在创建自己的 JIT 已经在读取的临时资源?谢谢
【问题讨论】:
-
根本没有资源。元素被简单地创建并添加到可视化树中。
-
我认为混淆可能在于按钮是什么。任何一种方法都会在内存中创建一个对象。这不需要编译,它是一个按钮对象或一个形状或其他任何东西。不是代码。有一个与按钮关联的模板,但这也用于创建对象。所以一个按钮有一个边框。如果你给它一个字符串作为内容,那么就会创建一个文本块并制作按钮的内容,并将它的文本属性设置为你的字符串。但是该按钮的任何代码都已编译,并且在该按钮对象中执行它是按钮的事情。
标签: c# wpf xaml compilation baml