如何在WPF中创建基础页面?

10

我已决定让所有我的WPF页面注册路由事件。与其将注册代码包含在每个页面中,不如将它放在一个基类中,并在需要时使用。

我已决定让所有我的WPF页面注册路由事件。与其将注册代码包含在每个页面中,不如将它放在一个基类中,并在需要时使用。
public static readonly RoutedEvent MyEvent= EventManager.RegisterRoutedEvent("MyEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(BasePage));

在每个页面上,我决定创建一个基础页面(名为BasePage)。我将上述代码行放入我的基础页面中,然后更改了我的其他一些页面以从BasePage派生。我无法解决此错误:

Error 12“CTS.iDocV7.BasePage”不能成为XAML文件的根,因为它是使用XAML定义的。第1行第22个位置。C:\Work\iDoc7\CTS.iDocV7\UI\Quality\QualityControlQueuePage.xaml 1 22 CTS.iDocV7

有人知道如何最好地创建一个基础页面,以便我可以在任何WPF页面中使用想要使用的事件、属性、方法等吗?

5个回答

29

以下是我在当前项目中的做法。

首先,我定义了一个类(就像@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"
    />

因此,我将其声明为“my”命名空间中的PigFinderPage。您需要的任何页面级资源都必须使用类似的语法进行声明:


所以我在“my”命名空间中声明它为PigFinderPage。如果你需要页面范围内的资源,就得用类似的语法声明:
<my:PigFinderPage.Resources>
    <!-- your resources go here -->
</my:PigFinderPage.Resources>

最后,切换到这个新页面的代码后端,并将其类声明更改为派生自您的自定义类,而不是直接从 Page 派生,就像这样:

public partial class EarmarkSearchPage : PigFinderPage

记得将其保留为部分类。

这对我非常有效 - 我可以在“PigFinderPage”中定义一堆自定义属性和事件,并在所有派生类中使用它们。


但是,你如何在所有派生页面之间共享PigFinderPage资源呢?你上面的例子似乎暗示着你在每个派生类的XAML中定义它们 - 在这种情况下,如果你想要声明基本资源一次,那么你就需要复制和粘贴。 - Jack Ukleja
啊,是的。我使用的任何共享资源都是外部页面上的实时资源。有些在App.xaml中,有些在按需导入的资源字典中。 - Matt Hamilton
1
两件事情:第一,在 Xaml 定义的结尾处加上 </my:PigFinderPage>;第二,在继承另一个程序集时使用:xmlns:my="clr-namespace:Qaf.PigFM.WindowsClient;assembly=QafPigFM.WindowsClient.BasePages"。不要在分号和程序集标签之间添加空格,否则会导致项目无法编译。 - Youp Bernoulli

4
此外,可以查看附加事件,看看是否可以将您的事件附加到应用程序中的每个页面。这可能比使用自定义中间类更容易。请注意保留HTML标记。

2

这里有一个教程! 它很简单易懂。


2

我不确定这个问题,但是根据你的错误信息,我建议你尝试使用仅包含C#(.cs)代码的基类 - 不要使用XAML创建基类,只需创建一个扩展WPF页面类的标准.cs文件。


1

小更新:我刚试了一下,但它没起作用。这是我为解决问题所做的更改:

1.在许多论坛中,您会看到子页面必须继承自一个简单的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"时,智能感知可以识别PigFinderPage,但编译器不能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接