簡體   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