C# Fixing error: "An object reference is required for the non-static field, method, or property"
C# Fixing error: "An object reference is required for the non-static field, method, or property"
我是 C#(和编程)新手。
我有一个 windows 商店应用程序,我想在其中对倒数计时器的时间执行一些操作。所以我尝试创建一个类似 here 的事件,结果代码是这样的:
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 问题,应该多解释一下吗?我想我会做的。
在您的程序中,您正试图从 CountDownTimer class 到达 Views.EquationView.OnTimesUp();
。问题是,方程式视图没有针对所有对象的 OnTimesUp(),它是特定于对象的 - 因此 C# 不确定如何激活该函数。
正如您所描述的那样,解决方案是创建 View.EquationView.OnTimesUp() 的实例 - 这样,该函数将从 对象 中触发。
你说有问题,我说我们是来解决问题的。试试这个代码——如果它错了,用编译器消息评论这个答案,我们将看看如何修复它:)
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();
}
}
我是 C#(和编程)新手。 我有一个 windows 商店应用程序,我想在其中对倒数计时器的时间执行一些操作。所以我尝试创建一个类似 here 的事件,结果代码是这样的:
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 问题,应该多解释一下吗?我想我会做的。
在您的程序中,您正试图从 CountDownTimer class 到达 Views.EquationView.OnTimesUp();
。问题是,方程式视图没有针对所有对象的 OnTimesUp(),它是特定于对象的 - 因此 C# 不确定如何激活该函数。
正如您所描述的那样,解决方案是创建 View.EquationView.OnTimesUp() 的实例 - 这样,该函数将从 对象 中触发。
你说有问题,我说我们是来解决问题的。试试这个代码——如果它错了,用编译器消息评论这个答案,我们将看看如何修复它:)
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();
}
}