点击按钮后更改按钮文本,再次点击后将其更改回来。

14

我试图在每次单击按钮时更改按钮的文本。

按钮一开始是“ON”。当我第一次点击它时,它应该变为“OFF”,再次点击时,应该变回“ON”。

我知道如何在单击时将其更改为“OFF”,但我不确定如何检查第二次单击,以便我可以将文本更改回“ON”。

以下是我的目前的代码:

private void OrdersButton_Click(object sender, EventArgs e)
{
       OrdersButton.Text = " Turn Orders Off";
}
6个回答

18
尝试
    private void OrdersButton_Click(object sender, EventArgs e)
    {
        if (OrdersButton.Text == "Turn Orders On")
        {
            OrdersButton.Text = "Turn Orders Off";
        }
        else if (OrdersButton.Text == "Turn Orders Off")
        {
            OrdersButton.Text = "Turn Orders On";
        }
    }

希望这能帮到你。


13

我能看到这样做可能存在几个问题,并可以提供一个更加面向对象的解决方案:添加一个属性来跟踪当前的“状态”:

    private bool _IsOn;

    public bool IsOn
    {
        get
        {
            return _IsOn;
        }
        set
        {
            _IsOn = value;
            OrdersButton.Text = _IsOn ? "On" : "Off";
        }
    }

并使用事件处理程序来简单地切换属性:

private void OrdersButton_Click(object sender, EventArgs e)
{
     IsOn = !IsOn;
}
那样做会更容易在以后访问信息,而且你可以轻松地用任何你喜欢的东西替换开/关 - 即使需要全球化/本土化。我认为有代码依赖于显示文本是非常糟糕的编程实践...
编辑:此外,使用复选框或切换按钮岂不更合理?除了视觉表示不同之外,它可以直接达到你想要的效果...

2
+1,我非常赞同您的编辑。切换按钮更改其标题是糟糕设计的臭名昭著的例子,因为它们会让用户感到困惑。很难知道当前状态和要切换到的状态——按钮所说的内容还是它没有说的内容。复选框是远远更好的选择。请记住,复选框标题几乎总是应该以积极的方式表达,以避免创建双重否定。有关此问题的更多信息可以在我们的UX Q&A网站上找到。具体来说,请参见:http://ux.stackexchange.com/questions/1318/ - Cody Gray

3

只是测试当前文本:

OrdersButton.Text = OrdersButton.Text.EndsWith("Off") ? "Turn Orders On" : "Turn Orders Off";

编辑:正如Cody在下面的评论中指出的那样,这种方法在本地化方面效果不佳。如果要更轻松地进行本地化,请使用ViewState(假设初始文本是为了打开订单):

bool ordersWereOn = (ViewState["OrdersAreOn"] as bool?) ?? false;
ViewState["OrdersAreOn"] = !ordersWereOn;
OrdersButton.Text = ordersWereOn ? "Turn Orders On" : "Turn Orders Off";

请注意,这是使用内联if运算符。仅供参考。赞一个整洁的一行代码。 - aqua
2
这可能是一个简洁的一行代码,但是一旦你本地化用户界面,这种方法就会失败。 - Cody Gray

1

有很多方法可以做到这一点。
对我来说,我可能会使用ControlTag属性,因为:

  1. 它被存储在按钮变量中。您不需要任何外部变量
  2. 所有代码都可以写在一个方法中
  3. 您始终可以从其他方法\控件访问它

以下是示例代码:

private void OrdersButton_Click(object sender, EventArgs e)
{
    bool value = (OrdersButton.Tag as bool?) ?? true;
    OrdersButton.Tag = !value;

    OrdersButton.Text = "Turn Orders " + (value ? "On" : "Off");
}

您还可以设置默认的Tag值(true或false),并删除对null值的检查。 以后您始终可以通过以下方式访问它:

public void DoSomeImportantThings()
{
    var areOrdersTurnedOn = (bool)OrdersButton.Tag;
}

这不是最佳方法,只是另一种方法。
例如,Roman Gruber已经展示了可能是最好的答案,使用属性并将文本更改逻辑封装到setter中。

0
private void button4_Click(object sender, EventArgs e)
{
    if (button4.Text == "Show Password")
    {
        textBox2.PasswordChar = '\0';
        button4.Text = "Hide Password";
    }
    else
    {
        textBox2.PasswordChar = '*';
        button4.Text = "Show Password";
    }
}

0

这可以是您在Avalonia中的XML按钮:

<Button Width="..." Grid.Row="..." Grid.Column="..." HorizontalContentAlignment="Center" IsVisible="true" Click="OnClickStart" Content="Start"/>

然后你可以在视图中编写代码,该方法为:OnClickStart:

private void OnClickStart(object sender, RoutedEventArgs e)
    {
        Button startBtn = (Button) sender ;

        if (startBtn.Content is "Start")
        {
            System.Console.WriteLine("the start btn is pressed");
            startBtn.Content = "Stop";
        }else if (startBtn.Content is "Stop")
        {
            System.Console.WriteLine("the stop btn is pressed!");
            startBtn.Content = "Start";
        }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接