我注意到任何XAML文件(在WPF中)中的根元素似乎是以下之一:
Window
Page
UserControl
ResourceDictionary
Application
我试着把根元素改成local:MainWindow
,但是项目编译不了,说分部类的基类应该是一样的,那我猜根元素就是实类的基类,这是什么原因呢?既然根元素不能改成实类,我无法访问用MainWindow.xaml.cs
编写的依赖项属性。如何在XAML中引用这些DP?
另外,我还注意到一些第三方主题也提供了特殊的窗口类,在这种情况下,根元素经常会被改变,这是如何实现的呢?例如GlowWindow from HandyControl
1条答案
按热度按时间rqdpfwrv1#
我尝试将根元素改为local:MainWindow,然后项目无法编译,说分部类的基类应该是一样的,那么我猜根元素就是实际类的基类?
是的,这是正确的,根元素是 can 的基类,但不必在代码隐藏中指定。分部类(从XAML标记和代码隐藏文件编译)之间的连接是使用XAML中的
x:Class
属性指定的,请参见Code-Behind and XAML in WPF。XAML语言包含语言层级功能,可让您从标记档端将程式码档与标记档产生相关。特别是XAML语言定义了语言功能
x:Class
指示词、x:Subclass
指示词和x:ClassModifier
指示词。[...]分部类必须派生自支持根元素的类型。
"为什么会这样"
如果没有自定义代码,则代码隐藏文件不是必需的,请参见
x:Class
。在使用
x:Class
的现有编程模型中,x:Class
是可选的,因为具有没有代码隐藏的XAML页是完全有效的。但是,该功能与使用XAML的框架所实现的生成操作进行交互。即使有一个,基类 * 也可以省略 *,但是基类必须以某种方式确定,这是通过根元素类型完成的,请参见WPF中的代码隐藏、事件处理程序和部分类要求。
请注意,在标记编译建置动作的预设行为下,您可以在程式码后置的部分类别定义中,将衍生保留空白。编译的结果会假设页面根目录的支援型别是部分类别的基础,即使没有指定。
如何在xaml中引用这些DP?
只需将
Binding
与将MainWindow
指定为AncestorType
的RelativeSource
一起使用。如果您将
x:Name
指定给您的 windows ,您也可以在系结中使用ElementName
。第一次
另外,我还注意到一些第三方主题也提供了特殊的Window类,在这种情况下,根元素经常会发生变化。这是如何实现的?
不,它不是。例如,
GlowWindow
是定义的就像MainWindow
一样,带有代码隐藏,x:Class
引用它,Window
作为根元素。您在链接中看到的是创建了GlowWindow
的新派生,就像您从Window
创建MainWindow
一样。它们只是碰巧使用了相同的名称GlowWindow
。你自己尝试一下,通过指定
MainWindow
作为根元素来创建一个新窗口,这是完全相同的场景。