我注意到,任何XAML文件中的根元素(在WPF中)似乎都是:
WindowPageUserControlResourceDictionaryApplication我试图将根元素更改为local:MainWindow,但是项目无法编译,说部分类的基类应该是相同的。那么我猜根元素是实际类的基类吗?原因是什么?由于根元素不能更改为实际的类,所以我无法访问用MainWindow.xaml.cs编写的依赖项属性。如何在XAML中引用那些DPs?
此外,我还注意到一些第三方主题还提供了特殊的窗口类,在这种情况下,根元素经常会被更改。这是如何实现的?例如GlowWindow来自HandyControl
发布于 2022-11-30 09:46:38
I试图将根元素更改为local:MainWindow,然后该项目无法编译,说部分类的基类应该是相同的。那么我猜根元素就是实际类?的基类。
是的,这是正确的,根元素是可以的基类,但不一定要在代码隐藏中指定。部分类(从XAML标记编译而来)与代码隐藏文件之间的连接是使用XAML中的x:Class属性指定的,参见WPF中的代码隐藏和XAML。
XAML语言包含语言级别的特性,可以将代码文件与标记文件从标记文件端关联起来。具体来说,XAML语言定义了语言特性
x:Class指令、x:Subclass指令和x:ClassModifier指令。..。 部分类必须派生自支持的类型根元素。,原因是什么?
如果没有自定义代码,则代码隐藏文件不是必需的,请参阅x:Class。
在使用
x:Class的现有编程模型中,x:Class是可选的,因为拥有一个没有代码隐藏的XAML页面是完全有效的。但是,该功能与使用XAML的框架实现的构建操作交互。
即使有一个,基类也可以省略,但是必须以某种方式确定基类,这是通过根元素类型完成的,参见WPF中的代码隐藏、事件处理程序和部分类需求。
注意,在标记编译生成操作的默认行为下,可以将派生保留在代码隐藏端的部分类定义中。编译后的结果将假设页面根的支持类型是部分类的基础,即使它没有指定。
如何在xaml?中引用这些DPs?
只需将Binding与指定MainWindow为AncestorType的RelativeSource一起使用即可。
{Binding YourDependencyProperty, RelativeSource={RelativeSource AncestorType={x:Type local:MainWindow}}}如果将x:Name分配给窗口,则可以在绑定中使用ElementName。
<Window ...
x:Name="MyMainWindow">{Binding YourDependencyProperty, ElementName=MyMainWindow}此外,我还注意到一些第三方主题还提供了特殊的窗口类,在这种情况下,根元素经常会被更改。这是如何实现的?
不不是的。例如,GlowWindow就是定义的,就像您的MainWindow一样,使用代码隐藏和x:Class来引用它,并将Window作为根元素。您在链接中看到的是,创建了GlowWindow的一个新衍生物,就像您从Window创建MainWindow一样,不幸的是,它们恰好使用了相同的名称GlowWindow。注意名称空间。

自己尝试并通过将MainWindow指定为根元素来创建一个新窗口。这是完全相同的情况。
发布于 2022-11-30 16:11:41
我将补充“那个家伙”的答案。
在WPF中,通常将控件的逻辑部分(用Sharpe编写)与视觉部分(在主题模板中用XAML编写)分开。
对于您的示例,创建模板是多余的。但这样做是可以的:
public class MainWindowBase : Window
{
public int SomeProperty
{
get { return (int)GetValue(SomePropertyProperty); }
set { SetValue(SomePropertyProperty, value); }
}
public static readonly DependencyProperty SomePropertyProperty =
DependencyProperty.Register("SomeProperty", typeof(int), typeof(MainWindowBase), new PropertyMetadata(0));
}
public partial class MainWindow : MainWindowBase
{
public MainWindow()
{
InitializeComponent();<local:MainWindowBase x:Class="****.MainWindow"https://stackoverflow.com/questions/74625291
复制相似问题