Как мне создать базовую страницу в WPF?
Вопрос
Я решил, что все мои страницы 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, но не компилятор.