Включение и отключение кнопок в wpf

У меня есть несколько Buttons на экране. По щелчку одного Button остальные все остальные Buttons должны быть отключены. Есть ли способ создать один единственный метод и установить включение и отключение всех Buttons вместо включения и отключения отдельных Buttons.


person Virus    schedule 01.01.2013    source источник
comment
также ... что вы пробовали? Покажите нам свой код, пожалуйста.   -  person Shahnawaz    schedule 01.01.2013


Ответы (4)


Этот метод предполагает, что кнопки находятся в одной и той же сетке, он меняет состояние Enabled каждой кнопки, кроме той, которая выполняет щелчок.

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;
        }
    }
}
person Mark Hall    schedule 01.01.2013
comment
Это работает, если я пишу код в событии Button_Click. Но я использую шаблон MVVM. Поэтому для реализации этого мне нужно знать отправителя. Откуда я это знаю? - person Virus; 02.01.2013
comment
Я использую команду при нажатии кнопки и привязываю параметры, которые мне нужно передать. Я получаю параметры через объект, но не через отправителя, поэтому я не могу отключить остальные кнопки в зависимости от отправителя. - person Virus; 02.01.2013
comment
Если вы используете MVVM light, см. эту stackoverflow.com/questions/2963830/. - person Mark Hall; 02.01.2013

Напишите один метод, который обрабатывает все нажатия кнопок. вот пример:

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

РЕДАКТИРОВАТЬ: я упустил из виду тот факт, что вы не хотите включать/отключать отдельные кнопки. Поэтому я бы порекомендовал ответ Марка.

person Abdusalam Ben Haj    schedule 01.01.2013

У меня есть идея для вас, создайте метод, который сначала отключает все кнопки. Сначала вызовите этот метод при нажатии любой кнопки, чтобы все кнопки были отключены, а затем просто включите кнопку, которую вы только что нажали, для этого отдельного метода обработчика события нажатия кнопки.

person Shahnawaz    schedule 01.01.2013

Я завершаю ответ Марка Холла ссылкой, предоставленной Кристианом в его комментарии. Вам это может понравиться.
Нет необходимости, чтобы кнопки находились в одной сетке или обрабатывали все события нажатия.

Вместо этого обработайте событие 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;
        }
    }
}
}
person Ramin    schedule 01.01.2013
comment
Проблема в отправителе. Поскольку я использую шаблон MVVM, как я узнаю отправителя? - person Virus; 02.01.2013