wpf使相同的按钮在多次单击后显示不同的信息

时间:2018-02-27 22:01:01

标签: c# wpf

我正在创建具有按钮的内容,以显示不同的信息。我不想创建很多按钮,但我不知道如何让按钮显示不同的信息。

<Button x:Name="btn1"
        Content=""
        Click="btn1_Click"/>
<Button x:Name="btn2"
        Content=""
        Click="btn2_Click"/>
<Button x:Name="btn3"
        Content=""
        Click="btn3_Click"/>
<Button x:Name="btn4"
        Content=""
        Click="btn4_Click"/>
<Button x:Name="btn5"
        Content=""
        Visibility="Hidden"
        Click="btn5_Click"/>
<Button x:Name="btn6"
        Content=""
        Visibility="Hidden"
        Click="btn6_Click"/>
<Button x:Name="btnBack"
        Content="Return to Main Menu"
        Visibility="Hidden"
        Click="btnBack_Click"/>

如果您点击主菜单中的btn1并再次点击它会显示信息,但点击主菜单中的btn2并点击btn1后,它会显示不同的信息。我不知道我怎么能做到这一点,到目前为止我没有找到任何帮助我。

3 个答案:

答案 0 :(得分:1)

任何带有一堆手工制作的通用控件的东西在WPF中都有一股气味,你的情况也不例外。这可能听起来很糟糕,但实际上在WPF方面是非常好的。为什么?因为这意味着你可以学习WPF的动态,并希望学会如何克服气味(至少在这种情况下)。

免责声明: 这些部分和想法都在这里,但不需要制作完整的解决方案,实际上可能阻碍学习过程。

你显然有一些动态按钮,你想控制可见性,功能和显示。如果我们尝试使用已经创建的按钮来执行这些操作,它会很快变得讨厌和肮脏。那么我们该怎么办?好吧,让我们创建一个小类来保存我们的一些按钮信息。

public class MyButton : INotifyPropertyChanged
{
    //Assume all properties did change notifications

    public string Text { get; set; }
    public ICommand Command { get; set; }
    public Visibility Visibility { get; set; }
}

现在让我们假设您在ViewModel或Window本身中都有ObservableCollection个这些按钮。

你可能会想,“好吧,那太好了,但是我仍然需要将所有这些都绑定到我拥有的按钮上。”你错了!

WPF有很多容器。其中一个是ItemsControl。有了这个,我们可以收集MyButton的集合,让它为我们完成所有的工作。你能品尝一下清洁度吗?好吃不是吗?

<ItemsControl Items="{Binding YourCollectionOfMyButton}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
                <Button Content="{Binding Text}"
                        Command="{Binding Command}"
                        Visibility="{Binding Visibility}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

现在有一些UI工作要做,让它看起来很漂亮,但你去了。现在,无论你使用什么按钮都没关系,除了更新该集合之外,你不需要做任何工作。

您希望如何处理管理该集合中的按钮取决于您,但确实知道您不再需要通过箍来管理硬编码的X个按钮。您可以清除该集合,添加1个MyButton并完成它。需要加30?你可以!

答案 1 :(得分:0)

你可以做这样的事情

  switch (btn.Text)
  {
      case "first":
          btn.Text="second";
          break;
      case "second":
          btn.Text="third";
          break;
      }

答案 2 :(得分:0)

也许你可以利用enum 来获得优势。

一个例子是:

public enum Action
{
    Button1_Action1,
    Button1_Action2
}

// In your form/window

private Action _currentAction = Action.Button1_Action1;

// After you click btn2
_currentAction = Action.Button1_Action2;

// After you click btn1
switch (_currentAction)
{
    case Action.Button1_Action1:
        // Do something
        break;
    case Action.Button1_Action2:
        // Do something else
        break;
}

希望这会给你一个想法:)