XAML的顶级元素可以是其他值吗?

leachiowour 2014-03-28 04:12:07
在WPF编程宝典中,对于XAML的顶级元素有如下的说明:
XAML文档基本框架
<Window x:Class="WpfDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
</Grid>
</Window>
这个文档只包含两个元素——顶级的Window元素,以及一个Grid元素,Window元素代表整个窗口,在Grid元素中可以放置所有控件。尽管可以使用任何顶级元素,但是WPF应用程序只使用以下几个元素作为顶级元素:
①Window元素
②Page元素(该元素和Window元素类似,但是它用于可导航的应用程序)
③Application元素(该元素定义应用程序资源和启动设置)

但是在反编译查看Microsoft Help Viewer时会发现一些其他的顶级元素,具体的过程如下:
一般在安装Visual Studio时都会安装Microsoft Help Viewer,位于C:\Program Files\Microsoft Help Viewer\v2.1目录下,我这里安装的是Visual Studio 2013,对应的Microsoft Help Viewer v2.1,如果使用Reflector之类的反编译工具查看HlpViewer.exe就可以知道这个程序是使用WPF进行编写的。在目录C:\Program Files\Microsoft Help Viewer\v2.1\zh-Hans下是对应的中文资源文件,如果使用Reflector工具打开HlpViewer.resources.dll进行反编译查看资源,就会看到很多编译后的baml文件的顶级元素既不是Window、也不是Page、更不是Application,例如有些顶级元素是SplashWindow,位于views/splashwindow.baml。具体的代码如下:
<SplashWindow FrameworkElement.Width="458" FrameworkElement.Height="598" Window.ResizeMode="NoResize" Window.WindowStyle="None" Window.WindowStartupLocation="CenterScreen" Window.ShowInTaskbar="False" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Grid>
<Image Image.Source="/Images/Splash.png" Image.Stretch="UniformToFill" />
<TextBlock TextBlock.Name="productNameTextBlock" FrameworkElement.Margin="30,27,30,100" TextBlock.Foreground="#FFFFFFFF" TextBlock.FontSize="32" FrameworkElement.HorizontalAlignment="Left" FrameworkElement.VerticalAlignment="Top" TextBlock.TextWrapping="Wrap" TextBlock.Text="{x:Static res:Resources.productNameText}" />
<TextBlock TextBlock.Name="versionTextBlock" FrameworkElement.Margin="30,92,30,100" TextBlock.Foreground="#FF999999" TextBlock.FontSize="27" FrameworkElement.HorizontalAlignment="Left" FrameworkElement.VerticalAlignment="Top" TextBlock.TextWrapping="Wrap" TextBlock.Text="{x:Static res:Resources.versionText}" />
<TextBlock TextBlock.Name="copyrightTextBlock" FrameworkElement.Margin="30,0,30,72" TextBlock.Foreground="#FF999999" TextBlock.FontSize="12" FrameworkElement.HorizontalAlignment="Left" FrameworkElement.VerticalAlignment="Bottom" TextBlock.TextWrapping="Wrap" TextBlock.Text="{x:Static res:Resources.copyrightText}" />
<TextBlock TextBlock.Name="registrationTextBlock" FrameworkElement.Margin="32,0,30,32" TextBlock.Foreground="#FFFFFFFF" TextBlock.FontSize="14" FrameworkElement.HorizontalAlignment="Left" FrameworkElement.VerticalAlignment="Bottom" TextBlock.TextWrapping="Wrap" TextBlock.Text="{x:Static res:Resources.registrationText}" />
</Grid>
</SplashWindow>

与一般的xaml文件不同,一般的xaml文件都是Window作为顶级元素,如果在Visual Studio中创建一个使用SplashWindow作为顶级元素的xaml文件是无法正常编译的。
谁能帮忙解释一下,这个顶级元素的究竟是怎么回事?
...全文
304 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
欢乐的小猪 2014-04-28
  • 打赏
  • 举报
回复
可以是任何控件
kenei 2014-04-28
  • 打赏
  • 举报
回复
win8的metro应用和wpf一样界面用xaml语言,splashwindow应该是程序刚打开时那个显示的界面,我想这个splashwindow是不是只在win8 app开发项目里面才有的顶级元素.
  • 打赏
  • 举报
回复
可以是其他的值 啊,我就用过用户控件UserControl
  • 打赏
  • 举报
回复
可以是任何控件,包括你自定义的任何控件。 只不过要注意,xaml中使用顶级元素时要说明 xmlns 默认命名空间。只要有它就行了。
jv9 2014-03-29
  • 打赏
  • 举报
回复
在WPF开发中,微软已经预先定义了control,page等对象,例如
<Page x:class=...> </Page>
<UserControl ...> </UserControl>
同时,开发人员可以创建自定义类或者控件,当然也可以使用自定义的名称作为对象名. 例如:
<SpecialTextBox></SpecialTextBox>

推荐阅读XAML教程:

http://www.cnblogs.com/jv9/archive/2012/06/18/2553052.html
leachiowour 2014-03-28
  • 打赏
  • 举报
回复
引用 1 楼 KumaPower 的回复:
我猜是不是指明它是主窗口?
我贴上来的那个SplashWindow就是打开Microsoft Help Viewer时最先闪出来的界面,Visual Studio也有这样的程序启动界面。主要是不理解这个“顶级元素”在书中说只有三种,在代码中感觉和这种说法对不起来,如果直接使用贴出来的代码创建个SplashWindow的xaml文件又编译不过,实在是费解。
Bonjour-你好 2014-03-28
  • 打赏
  • 举报
回复
我猜是不是指明它是主窗口?

8,734

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧