簡體   English   中英

C#修復錯誤:“非靜態字段,方法或屬性需要對象引用”

[英]C# Fixing error: “An object reference is required for the non-static field, method, or property”

我是C#(和編程)新手。 我有一個Windows商店應用程序,我想在其中執行倒數計時器計時的一些操作。 所以我嘗試在這里創建一個事件,結果代碼如下:

CountDownTimer.cs

public void timer_Tick(object sender, object e)
{
    if (sw.Elapsed < duration)
    {
        Seconds = (int)(duration - sw.Elapsed).TotalSeconds;
        TimeElapsed = String.Format("{0} second(s)", Seconds);
    }
    else
    {
        TimeElapsed = "Times Up";
        timer.Stop();
        Views.EquationView.OnTimesUp();
    }
}

EquationView.xaml.cs

public event System.EventHandler TimesUp;
public void OnTimesUp()
{
    if (TimesUp != null)
    {
        TimesUp(this, EventArgs.Empty);
        submitButton.IsEnabled = true;
        MessageDialog msgDialog = new MessageDialog("Your time's up which counts as a wrong answer. Click start for a new equation");
        msgDialog.ShowAsync();
        //more code
    }
}

但是我得到了問題標題中提到的錯誤。 搜索MDSN和SO似乎我有兩個選擇

1) 將OnTimeSUp(設置為靜態 ,然后submitBtn.IsEnabled = true; 給我一個錯誤。 我試圖將按鈕作為參數傳遞,但它不會

2)更改Views.EquationView.OnTimesUp(); this.Views.EquationView.OnTimesUp(); 創建一個新實例 ,然后創建 instance.Views.EquationView.OnTimesUp() ; 仍然有問題

非常感謝您的幫助。 我也樂於接受有關更優雅,更高效的代碼的建議。

-更新-感謝A.Abramov,我不再遇到錯誤,但是除了顯示消息對話框和更新數據模型(第一行)之外,方法OnTimesUp()也不起作用。 當由其他方法調用時,其他行也會起作用。

CountDownTimer.cs

    public void timer_Tick(object sender, object e)
    {
        if (sw.Elapsed < duration)
        {
           //code
        }
        else
        {
           //THE CHANGE
            new Views.EquationView().OnTimesUp();
        }
    }

EquationView.xaml.cs

    public void OnTimesUp()
    {
        App.player.AnsweredWronglyAsync();
        AfterWrongAnswer();
        submitButton.IsEnabled = false;
        commandBarResetButton.IsEnabled = false;
        MessageDialog timesUpMsg = new MessageDialog("Time's up!");
        timesUpMsg.ShowAsync();
    }

好吧好吧。 這不是典型的OOP問題,應該進一步解釋。 我想我會做的。

在您的程序中,您嘗試到達Views.EquationView.OnTimesUp(); 從CountDownTimer類。 問題是,方程式視圖沒有針對所有對象的OnTimesUp(),而是對象特定的-因此C#不確定如何激活該函數。

如您所描述的,解決方案是-創建View.EquationView.OnTimesUp()的實例-這樣,該函數將在object中觸發。

您說這有問題,我說我們是在這里解決問題。 嘗試使用此代碼-如果輸入錯誤,請在編譯器消息中對此答案進行評論,然后我們將介紹如何解決它:)

public void timer_Tick(object sender, object e)
{
if (sw.Elapsed < duration)
{
    Seconds = (int)(duration - sw.Elapsed).TotalSeconds;
    TimeElapsed = String.Format("{0} second(s)", Seconds);
}
else
{
    TimeElapsed = "Times Up";
    timer.Stop();
    new Views.EquationView().OnTimesUp();
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM