在wpf中启用和禁用按钮

在wpf中启用和禁用按钮,wpf,button,mouseevent,Wpf,Button,Mouseevent,我在屏幕上有几个按钮。单击一个按钮rest,应禁用所有其他按钮。是否有一种方法可以创建一个单一的方法并设置启用和禁用所有按钮而不是启用和禁用单个按钮我有个主意,首先创建一个禁用所有按钮的方法。每当单击任何按钮时,首先调用该方法,以禁用所有按钮,然后仅为单个按钮单击事件处理程序方法启用刚才单击的按钮。此方法假定按钮位于同一网格上,它会反转每个按钮的启用状态,但执行单击的按钮除外 main window.xaml <Window x:Class="WpfApplication1.MainWin

我在屏幕上有几个
按钮。单击一个
按钮
rest,应禁用所有其他
按钮
。是否有一种方法可以创建一个单一的方法并设置启用和禁用所有
按钮
而不是启用和禁用单个
按钮
我有个主意,首先创建一个禁用所有按钮的方法。每当单击任何按钮时,首先调用该方法,以禁用所有按钮,然后仅为单个按钮单击事件处理程序方法启用刚才单击的按钮。

此方法假定按钮位于同一网格上,它会反转每个按钮的启用状态,但执行单击的按钮除外

main window.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>

编写一个方法来处理所有单击的按钮。以下是一个例子:

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

编辑:我忽略了一个事实,即您不想启用/禁用单个按钮。因此,我推荐Mark answer。

我用Christian在评论中提供的链接完成Mark Hall的答案。你可能会喜欢它。
按钮不需要在一个网格中,也不需要处理所有的点击事件

在父窗口中处理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;
     }
}
}
void window\u预览鼠标左键向下(对象发送器,鼠标左键)
{
win窗口=发送方作为窗口;
如果(例如,OriginalSource是按钮)
{
按钮btn=(按钮)e.来源;
foreach(FindVisualChildren(win)中的按钮0)
{
如果(btn!=按钮0)
按钮0.IsEnable=错误;
}
}
}
它使用以下方法。看

公共静态IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject
{
if(depObj!=null)
{
for(int i=0;i
还有。。。你试过什么?请给我们看你的代码。如果我在“按钮点击事件”下写代码,这个功能就可以使用。但我使用的是MVVM模式。所以要实现这一点,我需要知道发送者。我是如何知道的?我使用命令单击按钮并绑定需要传递的参数。我通过对象而不是发送方接收参数,因此我无法基于发送方禁用其余按钮。如果您使用MVVM light,请参见此。问题在于发送方。由于我使用的是MVVM模式,我将如何了解发送者?
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;
     }
}
}
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;
        }
    }
}
}