繁体   English   中英

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

[英]wpf making the same button show different info after multiple clicks

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

<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 ,它会显示不同的信息。 我不知道我怎么能做到这一点,到目前为止我搜索的任何内容都没有帮助我。

任何带有手动创建的一堆通用控件的东西在 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吗? 你可以!

你可以做这样的事情

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

也许您可以使用枚举来发挥自己的优势。

一个例子是:

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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM