在没有 switch 语句的情况下将文本分配给正确的按钮

assiging text to the correct button without switch statement

正在用 C# 在 VS2012 中为 windows phone 8.0 开发应用程序

我的代码工作正常,但它太长了,我认为有一种字符串格式可以在 1 行代码中执行相同的操作 问题是我不知道该怎么做

示例:我需要通过按钮名称将按钮内容文本字符串分配给正确的 TextBlock(btn2 --> t2,btn3 --> t3)

有 8 个按钮 (btn1...btn8) 和 8 个文本块 (t1.....t8)

所以我有这段代码并且它有效:

private void LetterClicked(object sender, RoutedEventArgs e)
    {
        Button btn = sender as Button;
        switch (lettersTyped)
                {
                    case 1:
                        t1.Text = btn.Content.ToString();
                        break;
                    case 2:
                        t2.Text = btn.Content.ToString();
                        break;
                    case 3:
                        t3.Text = btn.Content.ToString();
                        break;
                    case 4:
                        t4.Text = btn.Content.ToString();
                        break;
                    case 5:
                        t5.Text = btn.Content.ToString();
                        break;
                    case 6:
                        t6.Text = btn.Content.ToString();
                        break;
                    case 7:
                        t7.Text = btn.Content.ToString();
                        break;
                    case 8:
                        t8.Text = btn.Content.ToString();
                        break;
                }
    }

我想要其他不使用 switch 语句的方法

喜欢:t"The code determines the number".Text = btn.Content.ToString();

您可以将所有文本块添加到列表中并进行相应处理:

List <TextBlock> TBlocks=new List<TextBlock>();
TBlocks.Add(t1);
...
TBlocks.Add(t8);

private void LetterClicked(object sender, RoutedEventArgs e)
{
        Button btn = sender as Button;
        TBlocks[lettersTyped-1].Text= btn.Content.ToString();
}

您可以使用您的字母计数和必须更改的控件来初始化 Dictionary<int, TextBlock>,并且仅参考键入的字母数:

dic[lettersTyped].Text = btn.Content.ToString();

如果您不想手动初始化所​​有块,可以通过解析文本块 ID 来初始化您的目录。但是我看不出有什么方法可以让你在一行中完成它(除非它是一条长线)

伪代码:

  • 找到所有相关的文本块(例如,所有带有 textxxx 和 xxx 数字形式的 id 的文本块)
  • 提取每个文本块 tb 的 id 的数字部分
  • 在字典中添加一个键 xxx 和值控制 tb 的条目
  • 使用字典取消引用正确的文本块[键入的键]

如果您的 TextBlock 在一个容器中,例如 StackPanel,例如:

<StackPanel x:Name="container">
    <TextBlock x:Name="t1" />
    <TextBlock x:Name="t2" />
    <TextBlock x:Name="t3" />
    <TextBlock x:Name="t4" />
    <TextBlock x:Name="t5" />
    <TextBlock x:Name="t6" />
    <TextBlock x:Name="t7" />
    <TextBlock x:Name="t8" />
</StackPanel>

然后你可以通过索引获取它们。

TextBlock tb = container.Children[lettersTyped - 1] as TextBlock; // Convert lettersTyped to 0-based index
tb.Text = btn.Content.ToString();

创建一个全局(private/public/whatever)字典:

private Dictionary<Button, TextBox> dict;

然后在某处初始化它(例如页面的构造函数):

dict = new Dictionary<Button, TextBox>()
{
    { btn1, t1 },
    { btn2, t2 }
};

最后,您将同一个 Click 处理程序附加到所有按钮:

private void button_Click(object sender, EventArgs e)
{
    Button btn = sender as Button;
    dict[btn].Text = btn.Text;
}

Sender 是您单击的 Button,因此您只需从中获取文本并将其附加到分配给 Dictionary 中的 Button 的 TextBox。 这样您就不需要处理任何列表索引。