C#WPF按钮启用/禁用

时间:2019-03-18 00:27:07

标签: c# wpf

我有一个按钮,它是:

<Button Style="{StaticResource ButtonStylePermit1}" 
 Click="permit1_Click" x:Name="permit1" IsEnabled="False"/>

在我的.cs代码中,我还有一个int floor = 1;

如果floor = 2,我希望能够启用该按钮,否则,请禁用该按钮。最好的方法是什么?

3 个答案:

答案 0 :(得分:0)

在您的.cs代码中,创建一个禁用或启用按钮的方法,然后在下限更改值时调用该方法。因此,一种简单的实现方法是在楼层成员上创建一个公共属性,并使用该属性更改楼层的值以及更改按钮的启用属性。

private int floor;

public int Floor{
    get { return this.floor;}
    set { 
        this.floor = value; 
        if (this.floor == 2)
        { this.permit1.Enabled = false }
        else {this.permit1.Enabled = true}     
    }
}
this.Floor = 1;

答案 1 :(得分:0)


提供了两种解决方案,如下所示:

  1. 直截了当的想法:

    如果(floor == 2)allow1.IsEnabled = true;
    否则allow1.IsEnabled = false;

  2. 三元组

    permit1.IsEnabled =(floor == 2)? true:否;

您可以尝试以下XAML代码作为示例:

<WrapPanel>
    <Button x:Name="permit1" Content="Test" Width="200" Click="permit1_Click" IsEnabled="False" Background="Red"/>
    <Button x:Name="Button1" Content="Press here" Width="100" Click="Button_Click"/>
</WrapPanel>

MainWindow.xaml.cs包含以下C#代码:

int floor;
    Random random01 = new Random();

    public MainWindow()
    {
        InitializeComponent();
    }

    private void permit1_Click(object sender, RoutedEventArgs e)
    {
         //your code here
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        floor = (int)Math.Round(random01.NextDouble(), 0) + 1;
        Button1.Content = floor;
        permit1.IsEnabled = (floor==2) ? true : false;
        /*
        if (floor == 2)
            permit1.IsEnabled = true;
        else
            permit1.IsEnabled = false;
        */
    }

答案 2 :(得分:0)

在WPF中,处理此问题的典型方法是使用data binding with value convertor

这里是您需要进行的更改的快速浏览:

在xaml中,您将控件的IsEnabled属性绑定到Floor

<Button  Content="Click Me!" Click="button_Click" 
x:Name="permit1" IsEnabled="{Binding Floor, Converter={StaticResource  converter}}">

Floorint,而IsEnabledbool,要链接这些链接需要转换器,我已将转换器作为Windows资源放入其中,以便它可以用于多个不同的对象(在同一类中,但是您可以将其放在中央的resource.xaml文件中)。

<Window.Resources>
    <local:FloorToEnableConverter x:Key="converter" />
</Window.Resources>

要使该框架能够找到您的属性Floor,它应该在XAML的数据上下文中,我已经在构造函数后面的代码中完成了此操作

public MainWindow()
{
    InitializeComponent();
    this.DataContext = this;
}

您需要在自己的类中定义此转换器的逻辑,这只是IValueConverter接口的实现

 public class FloorToEnableConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (value == null)
                    throw new ArgumentException("value cannot be null");

                if ((int)value == 1)
                    return false;
                if ((int)value == 2)
                    return true;

                // for all other values disable
                return false;
            }

            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
}

最后,当属性更改时,您需要通知UI有关更改,因此需要由INotifyPropertyChangeInterface

实施

我已经在我的演示课上实现了

public partial class MainWindow : Window, INotifyPropertyChanged

实际的代码是:

public event PropertyChangedEventHandler PropertyChanged;

        public int floor;
        public int Floor
        {
            get { return this.floor;}
            set { this.floor = value;
                // The string here should exactly match the property name
                OnPropertyChanged("Floor"); }
        }
        private void OnPropertyChanged(string property)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(property));
        }

即使在本示例中我已经在类背后的代码中实现了更改通知的代码,这也应该起作用,在WPF中,请尝试避免使用类背后的代码,这是win表单中必需的,但是WPF提供了替代方法机制。看一下MVVM pattern,了解一种更好的代码结构方式。