Windows Phone - 使用通用类来实现PhoneApplicationPage

3

我有一个页面,包含AddPage.xaml和AddPage.xaml.cs。我想创建一个名为AddPage的泛型类,该类继承自PhoneApplicationPage,以外包一些重复代码,如Save或Cancel。 如果我将基类从PhoneApplicationPage更改为我的新泛型类,则会出现以下错误:Partial declarations of 'AddPage' must not specify different base classes.

2个回答

5
为了实现这个目标,您需要执行以下操作。
首先,创建您的基类。
public class SaveCancelPhoneApplicationPage : PhoneApplicationPage
{
    protected void Save() { ... }
    protected void Cancel() { ... }
}

然后,您的AddPage需要修改以继承基类。这主要需要在代码(AddPage.xaml.cs)和xaml中进行。 代码:
public partial class AddPage : SaveCancelPhoneApplicationPage  {  ... }

Xaml:

<local:SaveCancelPhoneApplicationPage
    x:Class="MyPhone.Namespace.AddPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyPhone.Namespace" 
       <!-- other xaml elements -->
</local:SaveCancelPhoneApplicationPage>

更新: 根据评论添加信息

如果您需要具有类似通用功能的功能,并且必须使用页面来完成此操作(而不是ViewModel),则仍然可以使用通用方法来实现此目的。

public abstract class SaveCancelPhoneApplicationPage : PhoneApplicationPage
{
    protected override void OnNavigatedTo(blaa,blaa)
    {
        var obj = CreateMyObject();
        obj.DoStuff();
    }

    // You should know what your objects are, 
    // don't make it usable by every phone dev out there
    protected MyBaseObject MyObject { get; set; }

    protected T GetMyObject<T>() where T : MyBaseObject 
    {
        return MyObject as T;
    }
}


public class AddPage : SaveCancelPhoneApplicationPage 
{
    public AddPage()
    {
        MyObject = new MyAddObject();
    }
}

你不能将它泛化,因为XAML不支持这个。最好的方法是使方法泛型化。 - Shawn Kendrot
事件必须直接到达顶层类。您可能希望走MVVM的路线,而不是将其分类为PhoneApplicationPage。我知道(标准)应用栏按钮不允许绑定,但您仍然可以有一个点击事件调用VM。还有一些可用的工具包,其中包含可绑定的应用栏。 - Shawn Kendrot
这听起来不太好。我肯定需要一个通用类,因为我需要在运行时创建对象实例。通用方法不起作用,因为我想要覆盖PhoneApplicationPage中的现有方法。 - zirkelc
谢谢你的帮助,我认为那是我问题的正确答案,但似乎有点复杂。你有其他关于我的需求的想法吗?我想重用代码,例如从查询字符串解析ItemId并从ViewModel检索Item或本地化应用程序栏。一种可能的解决方案是扩展方法,但我不确定这是否是一个好主意? - zirkelc
@c.z,将其转换为通用类非常简单。只需创建一个扩展了您的GenericClass<YourSpecificType>的实心类并使用它即可。例如:class GenericClass<TType> : PhoneApplicationPage,然后class SolidClass : GenericClass<SolidType>。这符合您的要求吗? - Navigateur
显示剩余2条评论

0

为了外包一些函数,您只需声明一些附加类来执行常见工作。拥有另一页并不会完成这项工作。

public class Add
{
    public bool SaveContent(string filename, string content)
{
    ....//some content
    return true;
}

public string ViewContent(string filename)
{
    string content="";
    .....
    return content;
}
}

将这部分代码添加到您认为是多余的位置。
Add obj=new Add();
obj.SaveContent("myfile.txt","Hello.This is my content.");
string content("myfile.txt"); 

请告诉我这是否是您想要的。


我想从一个基类继承,因为我需要重写像OnNavigatedTo等方法。 - zirkelc
如果你想消除冗余,这个方法可以起作用。我无法理解你的目的。当你创建一个类的对象时,你的页面可以重写这些方法。 - Mani
我知道,但它有一些缺点。例如,我想实现一个应用栏本地化的方法。按照你的方式,我需要将应用栏实例传递给该方法。如果我从该类继承,我可以直接调用它而无需传递参数。我的目的是为我的XAML页面创建一个基类,该基类实现了一些常见的方法,如本地化、保存等。 - zirkelc
@websocialist,您想要将一个页面扩展到另一个页面。那么该页面不能成为手机应用程序的一部分。您不能扩展两个类。或者,如果您非常想制作页面,请使用可以完成该工作的用户控件。无论哪种方式,您都必须创建实例或引用。 - Mani

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