android 从一个类中控制2个不同的页面UI

qpgpyjmq  于 2022-12-09  发布在  Android
关注(0)|答案(2)|浏览(152)

我知道这个问题可能是无稽之谈,但我已经考虑了一段时间。我正在开发一个Xamarin Forms应用程序,它可以在Windows和Android上运行,而且它们共享大部分代码。但是,由于某些原因,有一个特定的页面需要特定于平台(因为UI元素的分布使应用程序看起来很奇怪)。随着代码行数的增加,并且它们几乎相同,我想到了创建一个单独的脚本来处理两个页面的逻辑,并且我只需从每个页面调用这些新方法。(我以前为每个UI元素创建了一些getter),由于每个页面都有不同的类名,比如说Page1和Page2,有没有什么方法可以在运行时设置,根据应用程序运行的平台,可以采用Page1或Page2类型的通用变量?
"我的努力"
我尝试过使用共享项目和编译指令

#if WINDOWS_UWP
...
#elif ANDROID
...
#endif

但我不知道是我不知道如何正确地使用它,还是它根本不起作用。在编译时,它说这个泛型变量没有属于Page1和Page2类的任何变量的定义。
"我的目标就是拥有这样的东西"

class Page1{
    int SameVariableName;
}

class Page2{
    int SameVariableName
}

class GenericClass{
    //Check if Platform is Windows or Android
    if (Windows) { Page1 pageVariable = new Page1();}
    else if (Android) { Page2 pageVariable = new Page2();}

    pageVariable.SameVariableName = (...);
}

问题在于,由于pageVariable赋值直到运行时才完成,因此会产生大量编译错误,例如pageVariable不包含SameVariableName的定义
非常感谢提前阅读这篇文章并试图帮助我

ddrv8njm

ddrv8njm1#

看起来你应该用相反的方法来做这件事。因为大多数代码是完全相同的,所以应该有一个Page类。
然后,您可以将Page1或Page2实际转换为Page类,这样您的泛型类就只处理Page类,而不必处理Page1或Page2。您可以继续执行代码,然后如果需要将它们发送回来,则转换为其他方式。
但是老实说,你要做的事情就是学习和使用C#接口,使用接口你可以创建一个父类来策略性地处理两个子类,这样问题在成为实际问题之前就已经解决了。你会有一个Page类,Page1和Page2都继承自Page类。你的编译器不会抱怨这种方式。

p5cysglq

p5cysglq2#

如果您有共用程式码,请从BasePage类别取得Page1和Page2 inherit
通过定义abstract(或virtual,如果需要“基本”定义)方法和属性,并在Page1和Page2中实现这些方法和属性,可以实现这些差异。

public abstract class BasePage
{
  abstract SomeType SomePropertyB { get; set; }
  abstract void SomeMethodA();
  public void SomeMethodC()
  {
    // These access values/code that are different, depending on which Page we are in.
    var b = SomePropertyB;
    SomeMethodA();
}
public class Page1 : BasePage
{
  override SomeType SomePropertyB
  {
    get => ...;
    set => ...;
  }
  override void SomeMethodA()
  {
    ...
  }

  // Putting a page into a variable that could be either page.
  BasePage page = new Page1();

如果没有共享的实现代码,BasePage可以是interface
按照惯例,有些名字以I开头:

public interface IPage
{
   SomeType SomePropertyB { get; set; }
   void SomeMethodA();
}
public class Page1 : IPage
{
  public SomeType SomePropertyB
  {
    get => ...;
    set => ...;
  }
  public void SomeMethodA()
  {
    ...
  }

  // Putting a page into a variable that could be either page.
  IPage page = new Page1();

相关问题