Создайте экземпляр окна, которое не является производным от окна WPF. - PullRequest
0 голосов
/ 30 мая 2011

У меня есть следующая иерархия классов:

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.

Есть ли лучший способ? Спасибо

Ответы [ 3 ]

1 голос
/ 30 мая 2011

Проверьте мой недавний пост , который объясняет именно такие вещи - как извлечь одну страницу из другой (методология точно такая же).

0 голосов
/ 30 мая 2011

Это нормальное использование.Вы на самом деле делаете то же самое, используя классы по умолчанию, созданные Visual Studio или Blend.

Обратите внимание, что вы наследуете от Window, поэтому фактический класс - MainWindow , но xaml использует базукласс окно

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>
0 голосов
/ 30 мая 2011

Ничто не мешает вам иметь ту иерархию, которую вы хотите здесь.Корневым элементом является базовый тип, а 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">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...