wpf 为什么MainWindow的根元素是Window而不是MainWindow?

z9ju0rcb  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(209)

我注意到任何XAML文件(在WPF中)中的根元素似乎是以下之一:

  • Window
  • Page
  • UserControl
  • ResourceDictionary
  • Application

我试着把根元素改成local:MainWindow,但是项目编译不了,说分部类的基类应该是一样的,那我猜根元素就是实类的基类,这是什么原因呢?既然根元素不能改成实类,我无法访问用MainWindow.xaml.cs编写的依赖项属性。如何在XAML中引用这些DP?
另外,我还注意到一些第三方主题也提供了特殊的窗口类,在这种情况下,根元素经常会被改变,这是如何实现的呢?例如GlowWindow from HandyControl

rqdpfwrv

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指定为AncestorTypeRelativeSource一起使用。

{Binding YourDependencyProperty, RelativeSource={RelativeSource AncestorType={x:Type local:MainWindow}}}

如果您将x:Name指定给您的 windows ,您也可以在系结中使用ElementName
第一次

另外,我还注意到一些第三方主题也提供了特殊的Window类,在这种情况下,根元素经常会发生变化。这是如何实现的?

不,它不是。例如,GlowWindow定义的就像MainWindow一样,带有代码隐藏,x:Class引用它,Window作为根元素。您在链接中看到的是创建了GlowWindow的新派生,就像您从Window创建MainWindow一样。它们只是碰巧使用了相同的名称GlowWindow

你自己尝试一下,通过指定MainWindow作为根元素来创建一个新窗口,这是完全相同的场景。

相关问题