![](/img/trans.png)
[英]WPF How to reuse Popup window xaml fragment to show on multiple different button clicks
[英]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.