在WPF中启用和禁用按钮

4

我屏幕上有几个按钮,点击一个按钮后,其他所有按钮都应该被禁用。是否有一种方法可以创建一个单一的方法,并设置启用和禁用所有按钮,而不是启用和禁用单个按钮


还有...你尝试过什么?请展示你的代码。 - Shahnawaz
4个回答

4

这种方法假定按钮在同一个网格上,它会反转除点击的按钮以外的每个按钮的启用状态。

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button_Click"  />
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="10,43,0,0" Name="button2" VerticalAlignment="Top" Width="75" Click="button_Click" />
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="10,76,0,0" Name="button3" VerticalAlignment="Top" Width="75" Click="button_Click" />
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="10,109,0,0" Name="button4" VerticalAlignment="Top" Width="75" Click="button_Click" />
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="10,142,0,0" Name="button5" VerticalAlignment="Top" Width="75" Click="button_Click" />
    </Grid>
</Window>

MainWindow.xaml.cs

private void button_Click(object sender, RoutedEventArgs e)
{
    Button btn = (Button)sender;
    foreach (FrameworkElement  item in ((Panel)btn.Parent).Children )
    {
        if (item is Button)
        {
            if (btn.Name != item.Name)
                item.IsEnabled = !item.IsEnabled;
        }
    }
}

这个在Button_Click事件下编写代码时是有效的。但我正在使用MVVM模式。所以为了实现这个,我需要知道发送者。我该如何知道呢? - Virus
我在按钮点击事件中使用命令,并绑定需要传递的参数。我通过对象接收参数,但不是发送者,因此无法根据发送者禁用其他按钮。 - Virus
如果您正在使用MVVM Light,请参阅此链接:https://dev59.com/RnA85IYBdhLWcg3wCfLm。 - Mark Hall

1
编写一个处理所有按钮点击的方法。以下是一个示例:
Private Sub ButtonsClick(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles button1.Click ,button2.Click ,button3.Click

button1.IsEnabled = (button1 is sender)
button2.IsEnabled = (button2 is sender)
button3.IsEnabled = (button3 is sender)


End Sub

编辑:我忽略了您不想启用/禁用单个按钮的事实。因此,我建议标记答案。


0
我在Mark Hall的回答中加入了Christian在评论中提供的链接。你可能会喜欢它。
没有必要将按钮放在一个网格中或处理它们所有的点击事件。
相反,在父窗口中处理PreviewMouseLeftButtonDown事件:
void window_PreviewMouseLeftButtonDown(object sender, MouseEventArgs e)
{
Window win = sender as Window;
if (e.OriginalSource is Button)
{
     Button btn=(Button)e.Source;
     foreach(Button button0 in FindVisualChildren<Button>(win))
     {
        if (btn != button0)
            button0.IsEnable = false;
     }
}
}

它使用以下方法。请参见按类型查找WPF窗口中的所有控件

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
        if (child != null && child is T)
        {
            yield return (T)child;
        }

        foreach (T childOfChild in FindVisualChildren<T>(child))
        {
            yield return childOfChild;
        }
    }
}
}

问题出在发送者。由于我正在使用MVVM模式,我该如何知道发送者是谁? - Virus

0
我有一个想法给你,创建一个方法来先禁用所有按钮。每当点击任何按钮时,首先调用该方法以禁用所有按钮,然后仅为该特定按钮单击事件处理程序方法启用您刚刚点击的按钮。

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