-1

我是 C# 的初学者,决定在 Winform 中创建基于文本的冒险游戏,但我一直在努力更新表单,只要它需要更新。过去,我曾经something.Invalidate();更新图像,但显然这不适用于整个表单。

我有一组基于整数显示文本的标签,每当整数的值更新时,我希望表单显示它。

到目前为止我所尝试的:

public partial class GameWindow : Form
{
    public void buttonInventory_Click(object sender, EventArgs e)
    {
        Basic.HP = Basic.HP++;
        this.Refresh();
    }
}

当 HP 更新时,表单不会显示它。还有什么我应该使用的Refresh();吗?大量的谷歌搜索主要导致了关于 Backgroundworkers 的解释,但我真的需要另一个线程来完成这么简单的事情吗?

4

3 回答 3

0

为什么不单独创建一个更新值的例程,在每次值更改后调用它。IE:(注意——我不会用 C# 编程):

public partial class GameWindow : Form
{
    public void buttonInventory_Click(object sender, EventArgs e)
    {
        Basic.HP = Basic.HP++;
        updateValues();
    }

    public void updateValues()
    {
        hp.text = HealthInteger;
        basic.text = BasicInteger;
    }
}

并称其为每一个价值变化。

于 2013-04-04T12:37:12.170 回答
0

标签不能绑定到字符串值,就像图像可以绑定到图片框一样。

这里最简单的解决方案是在每次更改 HP 属性时过于明确地设置标签的 Text 属性:

private void RefreshFormWithModel(Basic basic)
{
    labelHP.Text = basic.HP;
}

public void buttonInventory_Click(object sender, EventArgs e)
{
    Basic.HP = Basic.HP++;
    this.RefreshFormWithModel(Basic);
}

如果你真的想要复杂的绑定,这里有一些讲座。

于 2013-04-04T12:38:24.090 回答
0

我将假设类名Basic只是Basic

在课堂里Basic

private int hp;
public int HP
{
    get { return hp; }
    set { hp = value; HP_Changed(); }
}

public event EventHandler HPChanged;
private void HP_Changed()
{
    if (HPChanged != null) { HPChanged(this, new EventArgs()); }
}

在里面GameWindow

//where ever you create a new Basic, add to the event handler
Basic Basic = new Basic();
Basic.HPChanged += Basic_HPChanged;

private void Basic_HPChanged(object sender, EventArgs e)
{
    Basic b_sender = (Basic)sender;
    int NewHealth = b_sender.HP;
    //Update whatever value needs to be updated, here
}

然后,每当 Basic 的 HP 发生变化时,它都会在 GameWindow 中触发一个事件以更新相应的字段。

于 2013-04-04T12:52:53.850 回答