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
相关产品推荐
相关产品推荐

