题
我决定我的所有 WPF 页面都需要注册路由事件。而不是包括
public static readonly RoutedEvent MyEvent= EventManager.RegisterRoutedEvent("MyEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(BasePage));
在每个页面上,我决定创建一个基页面(名为 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:PigFinderPage.Resources>
<!-- your resources go here -->
</my:PigFinderPage.Resources>
最后,切换到这个新页面的代码隐藏,并更改其类声明,以便它派生自您的自定义类而不是直接从 Page 派生,如下所示:
public partial class EarmarkSearchPage : PigFinderPage
请记住将其保留为部分类。
这对我来说是一种享受 - 我可以在“PigFinderPage”中定义一堆自定义属性和事件,并在所有后代中使用它们。
其他提示
另外,看看 附属活动 并查看是否可以将事件附加到应用程序中的每个页面。可能比自定义中间类更容易。
我对此不太确定,但看看您的错误,我会尝试仅使用 c# (.cs) 代码定义基类 - 不要使用 XAML 创建基类,而只是扩展 WPF 页面的标准 .cs 文件班级。
这里 也是教程!这非常简单易行。
小更新:我只是尝试去做,但没有成功。他是我为了解决问题而改变的:
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”时,Intellisense 可以识别 PigFinderPage,但不能识别编译器。