【问题标题】:Create an instance of a window which is not directly derived from WPF Window创建不直接从 WPF 窗口派生的窗口实例
【发布时间】:2011-05-30 09:24:23
【问题描述】:

我有以下类层次结构:

abstract MyWindowBase : System.Windows.Window(即 WPF 之一)

MyWindow : MyWindowBase

我想创建一个 MyWindow 类型的窗口作为 XAML 中的根元素。我发现只有这种方式:

<local:MyWindowBase
    x:Class="MyWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    local:x="clr-namespace:MyProjectNamespace">

    <local:MyWindowBase.Resources>...</local:MyWindowBase.Resources>

    ...

</local:MyWindowBase>

即我将我的抽象类型指定为根元素,这看起来很尴尬。

我也尝试了明显的方法:

<Window
    x:Class="MyWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    ...
</Window>

并在代码隐藏中定义MyWindow : MyWindowBase,但它与生成文件中的类定义冲突,即MyWindow : Window

有没有更好的方法? 谢谢

【问题讨论】:

  • 在XAML中你只能创建基本类型的根元素,你的第一种方法是正确的,它有什么问题?你的根元素是抽象类型并没有什么尴尬。
  • @Akash - 没有真正的问题,只是我觉得很奇怪。但我可能是唯一的一个;)

标签: wpf xaml inheritance


【解决方案1】:

检查this recent post of mine,它准确地解释了这类事情 - 如何从另一个页面派生一个页面(方法完全相同)。

【讨论】:

    【解决方案2】:

    没有什么能阻止你在这里拥有你想要的任何层次结构。根元素是基本类型,x:Class 是您当前定义的生成类型。

    如果您希望将特定类称为MyWindow 并从MyWindowBase 派生,那么您的第一个示例是正确的:

    <local:MyWindowBase
        x:Class="MyWindow"
        local:x="clr-namespace:MyProjectNamespace">
    

    如果你希望特定的类派生MyWindow,那么你需要一个不同的类名:

    <local:MyWindow
        x:Class="MainWindow"
        local:x="clr-namespace:MyProjectNamespace">
    

    【讨论】:

      【解决方案3】:

      这是正常使用。您实际上是在使用 Visual Studio 或 Blend 创建的默认类做同样的事情。

      请注意,您是从 Window 继承的,因此实际类是 MainWindow,但 xaml 使用基类 Window

      C#

      public partial class MainWindow : Window
      {
          public MainWindow()
          {
              InitializeComponent();
          }
      }
      

      Xaml

      <Window
        x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        ...
      </Window>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-04
        • 2017-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多