首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么MainWindow窗口的根元素不是MainWindow?

为什么MainWindow窗口的根元素不是MainWindow?
EN

Stack Overflow用户
提问于 2022-11-30 09:15:26
回答 2查看 46关注 0票数 -1

我注意到,任何XAML文件中的根元素(在WPF中)似乎都是:

  • Window
  • Page
  • UserControl
  • ResourceDictionary
  • Application

我试图将根元素更改为local:MainWindow,但是项目无法编译,说部分类的基类应该是相同的。那么我猜根元素是实际类的基类吗?原因是什么?由于根元素不能更改为实际的类,所以我无法访问用MainWindow.xaml.cs编写的依赖项属性。如何在XAML中引用那些DPs?

此外,我还注意到一些第三方主题还提供了特殊的窗口类,在这种情况下,根元素经常会被更改。这是如何实现的?例如GlowWindow来自HandyControl

EN

回答 2

Stack Overflow用户

发布于 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与指定MainWindowAncestorTypeRelativeSource一起使用即可。

代码语言:javascript
复制
{Binding YourDependencyProperty, RelativeSource={RelativeSource AncestorType={x:Type local:MainWindow}}}

如果将x:Name分配给窗口,则可以在绑定中使用ElementName

代码语言:javascript
复制
<Window ...
        x:Name="MyMainWindow">
代码语言:javascript
复制
{Binding YourDependencyProperty, ElementName=MyMainWindow}

此外,我还注意到一些第三方主题还提供了特殊的窗口类,在这种情况下,根元素经常会被更改。这是如何实现的?

不不是的。例如,GlowWindow就是定义的,就像您的MainWindow一样,使用代码隐藏和x:Class来引用它,并将Window作为根元素。您在链接中看到的是,创建了GlowWindow的一个新衍生物,就像您从Window创建MainWindow一样,不幸的是,它们恰好使用了相同的名称GlowWindow。注意名称空间。

自己尝试并通过将MainWindow指定为根元素来创建一个新窗口。这是完全相同的情况。

票数 2
EN

Stack Overflow用户

发布于 2022-11-30 16:11:41

我将补充“那个家伙”的答案。

在WPF中,通常将控件的逻辑部分(用Sharpe编写)与视觉部分(在主题模板中用XAML编写)分开。

对于您的示例,创建模板是多余的。但这样做是可以的:

代码语言:javascript
复制
    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();
代码语言:javascript
复制
<local:MainWindowBase x:Class="****.MainWindow"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74625291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档