You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WPF开发:如何在不同按钮点击事件之间访问生成的数组

问题根源

你当前无法访问minorArcanaDeck的核心原因是:这个数组是定义在newRound_Click方法内部的局部变量,作用域仅局限于该方法内部,方法执行完成后变量就会被回收,同一个类的其他方法自然无法访问。

解决方案

把这个数组提升为MainWindow类的成员字段,让它的生命周期和窗口实例保持一致,就能在同一个类的所有方法里共享访问了,同时建议补充边界校验逻辑,避免操作顺序不当引发的异常。

修改后完整代码

public partial class MainWindow : Window
{
    // 将牌组定义为类的私有成员字段,全局可访问
    private string[] _minorArcanaDeck;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void newRound_Click(object sender, RoutedEventArgs e)
    {
        // 给成员字段赋值,替换原来的局部变量声明
        _minorArcanaDeck = new string[] {"Ace of Wands","Two of Wands", /* 补全剩余牌面内容即可 */};
        var rng = new Random();
        rng.Shuffle(_minorArcanaDeck);
    }

    private void drawCard_Click(object sender, RoutedEventArgs e)
    {
        // 边界校验:避免未洗牌直接抽牌引发空引用异常
        if (_minorArcanaDeck == null || _minorArcanaDeck.Length == 0)
        {
            myText.Text = "请先开始新回合洗牌后再抽牌";
            return;
        }
        myText.Text = _minorArcanaDeck[0];
    }
}

// FisherYatesShuffle 扩展方法无需改动
static class FisherYatesShuffle
{
    public static void Shuffle<T>(this Random rng, T[] array)
    {
        int n = array.Length;
        while (n > 1)
        {
            int k = rng.Next(n--);
            T temp = array[n];
            array[n] = array[k];
            array[k] = temp;
        }
    }
}

可选优化建议

  • 如果需要实现抽完第一张后下次抽第二张的逻辑,可以额外加一个整数字段记录当前抽牌的索引,每次抽牌后索引自增即可。
  • 也可以把Random也提升为类成员,避免多次点击newRound重复实例化Random导致的随机数分布不均匀问题。

内容的提问来源于stack exchange,提问作者Anjelo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:24:08