Как мне создать базовую страницу в WPF?

StackOverflow https://stackoverflow.com/questions/39843

  •  09-06-2019
  •  | 
  •  

Вопрос

Я решил, что все мои страницы WPF должны регистрировать перенаправленное событие.Вместо того, чтобы включать

public static readonly RoutedEvent MyEvent= EventManager.RegisterRoutedEvent("MyEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(BasePage));

на каждой странице я решил создать базовую страницу (с именем BasePage).Я поместил приведенную выше строку кода на свою базовую страницу, а затем изменил несколько других своих страниц, чтобы они были производными от базовой страницы.Я не могу пройти мимо этой ошибки:

Ошибка 12 "CTS.iDocV7.BasePage" не может быть корневым файлом файла XAML, поскольку он был определен с использованием XAML.Строка 1 Позиция 22.C:\Work\iDoc7\CTS.iDocV7\UI\Quality\QualityControlQueuePage.xaml 1 22 CTS.iDocV7

Кто-нибудь знает, как наилучшим образом создать базовую страницу, когда я могу размещать события, свойства, методы и т.д., которые я хочу иметь возможность использовать с любой страницы wpf?

Это было полезно?

Решение

Вот как я это сделал в моем текущем проекте.

Сначала я определил класс (как сказал @Daren Thomas - просто старый класс C #, не связанный с ним файл XAML), вот так (и да, это настоящий класс - лучше не спрашивать):

public class PigFinderPage : Page
{
    /* add custom events and properties here */
}

Затем я создаю новую страницу и изменяю ее объявление XAML на следующее:

<my:PigFinderPage x:Class="Qaf.PigFM.WindowsClient.PenSearchPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="clr-namespace:Qaf.PigFM.WindowsClient"
    />

Поэтому я объявляю его как PigFinderPage в " my " Пространство имен. Любые ресурсы всей страницы должны быть объявлены с использованием аналогичного синтаксиса:

<my:PigFinderPage.Resources>
    <!-- your resources go here -->
</my:PigFinderPage.Resources>

Наконец, переключитесь на код для этой новой страницы и измените его объявление класса так, чтобы оно было производным от вашего пользовательского класса, а не напрямую от Page, как здесь:

public partial class EarmarkSearchPage : PigFinderPage

Не забудьте сохранить его как частичный класс.

Это доставляет мне удовольствие - я могу определить множество пользовательских свойств и событий обратно в " PigFinderPage " и использовать их во всех потомках.

Другие советы

Кроме того, просмотрите присоединенные события и посмотрите, Вы можете прикрепить свое событие к каждой странице в вашем приложении. Может быть проще, чем пользовательский промежуточный класс.

Я не уверен в этом, но, глядя на вашу ошибку, я бы попытался определить базовый класс только с помощью кода на c # (.cs) - не создавайте его с XAML, просто стандартный файл .cs, который расширяет класс страницы WPF.

Здесь тоже учебник! это довольно просто и легко.

Небольшое обновление :Я просто пытался это сделать, и у меня ничего не получилось.Он - это то, что я изменил, чтобы решить проблему:

1.In на многих форумах вы прочтете, что вложенные страницы должны наследоваться от простого класса cs, без XAML.Хотя это работает.Я действительно наследую от обычной страницы XAML без каких-либо проблем.

2. Я заменил следующий код :

<my:PigFinderPage x:Class="Qaf.PigFM.WindowsClient.PenSearchPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:Qaf.PigFM.WindowsClient"
/>

с

<my:PigFinderPage x:Class="Qaf.PigFM.WindowsClient.PenSearchPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="using:Qaf.PigFM.WindowsClient"
/>

потому что, когда у меня было "clr-namespace" вместо "using", Intellisense мог распознать PigFinderPage, но не компилятор.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top