2016-11-09 113 views
-1

我真的有问题解决此问题。对象引用是必需的非静态字段,方法或属性'MainPage.readOut'

'HandleNewTag'方法在Droid MainActivity类中。这是一个非静态的,但抱怨它调用的'MainPage.HandleNFC'方法,所以我将它改为static,并且没有错误。

'MainPage.HandleNFC'方法也调用非静态方法。我将其更改为静态无效以阻止错误。然后在那个方法中,它设置了XAML控件的一些属性,它抱怨控件不是静态的,我无法改变。

我在互联网上搜索高和低来解决这个问题,虽然我可以找到类似的错误,但他们都没有提到非静态控制问题。

MainActivity.cs

public void HandleNewTag(object sender, NfcFormsTag e) 
{ 
    //MainPage mp = new MainPage(); 

    byte[] bytes = e.Id; 
    Console.WriteLine(BitConverter.ToString(bytes)); 

    if (BitConverter.IsLittleEndian) 
     Array.Reverse(bytes); 

    Console.WriteLine(BitConverter.ToString(bytes)); 
    // Call method to send byte stream across machine boundaries. 

    // Receive byte stream from beyond machine boundaries. 
    Console.WriteLine(BitConverter.ToString(bytes)); 
    if (BitConverter.IsLittleEndian) 
     Array.Reverse(bytes); 

    Console.WriteLine(BitConverter.ToString(bytes)); 
    int result = BitConverter.ToInt32(bytes, 0); 



    MainPage.HandleNFC(result.ToString()); 
} 

MainPage.xaml中

public static void HandleNFC(string convertedtag) 
{  
    addToReadout(convertedtag); 
} 

public static void addToReadout(string text) 
{ 
    Label label1 = new Label { Text = "Successfully clocked out @ " + text, TextColor = Color.Black }; 
    StackLayout sl = new StackLayout(); 



    readOut.Children.Add(label1); 
    readOut.BackgroundColor = Color.Black; 
    readOut.Children.Count(); 
} 
+0

这听起来像你开始时通过只是在'static'关键字扔在这里和那里只是为了让错误消失工作。这是错误的做法。 *应该*这些方法首先是“静态”的? – David

+0

是的你是对的,但是如果没有他们,它根本就行不通。第一种方法(Droid中的HandleNewTag)似乎不是静态的,但它抱怨它调用的方法(MainPage.HandleNFC)不是静态的。 – connersz

+0

也许它需要一个* MainPage'实例来调用'.HandleNFC()'在那个实例上?目前,您正试图将该方法称为静态。使*一切*静态来解决编译器错误听起来不理想。 – David

回答

0

有些事情错在这里。你为什么要从Xamarin.Android MainActivity调用你的Forms MainPage(住在PCL或共享项目中)?这里的依赖流向后。我还假设“MainPage.xaml”是“MainPage.xaml.cs”,因为您显示的是C#代码而不是XAML。

无论哪种方式,它看起来像你想添加标签到你的MainPage上的控件。生活在MainActivity.cs中的HandleNewTag事件处理程序可能不应该这样工作,因为当您必须考虑其他平台时,解决方案会变得复杂。通常,您希望将呼叫从PCL分流到特定于平台的项目,如Xamarin.Forms.DependencyService所做的(基本容器/ IoC模式)。

我知道,在Android上NFC功能需要应用程序或活动环境来执行操作,并且您收到的NFC读数将通过您的MainActivity进入。处理这种情况的一种方法是将Xamarin.Forms内置到MessagingCenter中。它只是为此目的而设计的,因为那样你也可以通过你的iOS或UWP项目的消息中心发送消息,并且一切都可以正常工作。您将拥有一个位于MainPage.xaml.cs中的MessagingCenter订阅,我通常会使用该东西的构造函数。

另一种选择是创建一个“AppViewModel”,它位于应用程序的顶层。我通常在我的App类中创建这个静态变量,所以我可以通过调用App.ViewModel(无论)从任何地方引用它。您的挑战将是采取这些数据并更新您的用户界面。我会通过将控件直接绑定到该静态实例中的源代码并创建一个利用OnPropertyChanged更新绑定的“刷新”机制来实现此目的。这当然是一个更复杂的解决方案,并且完全是围绕您正在尝试完成的任务而构建/设计的。

我希望这有助于!

披露:我对Xamarin /微软

相关问题