WPF中的禁用按钮?

Posted

技术标签:

【中文标题】WPF中的禁用按钮?【英文标题】:Disable button in WPF? 【发布时间】:2011-02-23 18:46:12 【问题描述】:

我的 WPF 应用程序中有一个按钮和一个文本框。在用户在 TextBox 中输入一些文本之前,如何使 Button 不启用?

【问题讨论】:

【参考方案1】:

应该这样做:

<StackPanel>
    <TextBox x:Name="TheTextBox" />
    <Button Content="Click Me">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="IsEnabled" Value="True" />
                <Style.Triggers>
                    <DataTrigger Binding="Binding Text, ElementName=TheTextBox" Value="">
                        <Setter Property="IsEnabled" Value="False" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
</StackPanel>

【讨论】:

在 ViewModel 中进行验证要优雅得多。看看 Josh Smith bitbonk 链接到的文章。 @Helge Klein,我完全同意,但是由于 OP 没有指定他正在使用 MVVM,如果你不熟悉,切换到它并不是一件容易的事,我想我'会以最简单的方式回答。 我明白了。我只是想向未来的读者指出最初更复杂的“更好”的解决方案。 我怎样才能为多个文本框和几个组合框实现相同的效果,但不是所有的组合框? 伙计,我必须编写这么多代码才能禁用按钮? WPF 很烂!【参考方案2】:

在MVVM 中(这让很多事情变得更容易 - 你应该尝试一下)你的 ViewModel 中有两个属性 Text 绑定到你的 TextBox 并且你会有一个 ICommand 属性@ 987654324@(或类似的)绑定到按钮:

<Button Command="Apply">Apply</Button>

ICommand 接口有一个方法CanExecute,您可以在其中返回true if (!string.IsNullOrWhiteSpace(this.Text)。其余的由 WPF 为您完成(启用/禁用,单击时执行实际命令)。

链接的文章详细解释了它。

【讨论】:

这需要更多的支持,应该标记为答案。正如@jairhumberto 所指出的,纯粹用 XAML 做这件事确实很糟糕。 MVVM 有一些学习曲线,但正如这个答案所说,一旦您使用 MVVM,解决问题的方法非常简单。 我也认为这是最好的答案。【参考方案3】:

按代码:

btn_edit.IsEnabled = true;

通过 XAML:

<Button Content="Edit data" Grid.Column="1" Name="btn_edit" Grid.Row="1" IsEnabled="False" />

【讨论】:

【参考方案4】:

我知道这不像其他帖子那样优雅,但它是一个更直接的 xaml/codebehind 示例,说明如何完成相同的事情。

Xaml:

<StackPanel Orientation="Horizontal">
   <TextBox Name="TextBox01" VerticalAlignment="Top" HorizontalAlignment="Left" Width="70" />
   <Button Name="Button01" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,0,0,0" />
</StackPanel>

代码隐藏:

Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded

        Button01.IsEnabled = False
        Button01.Content = "I am Disabled"

End Sub

Private Sub TextBox01_TextChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.TextChangedEventArgs) Handles TextBox01.TextChanged

        If TextBox01.Text.Trim.Length > 0 Then
            Button01.IsEnabled = True
            Button01.Content = "I am Enabled"
        Else
            Button01.IsEnabled = False
            Button01.Content = "I am Disabled"
        End If

End Sub

【讨论】:

Windows 8 beta 将成为实现这一目标的唯一可能性。至少在今天。【参考方案5】:

您可以订阅TextBox 上的TextChanged 事件,如果文本为空,则将Button 设置为禁用。或者您可以将Button.IsEnabled 属性绑定到TextBox.Text 属性并使用转换器,如果有任何文本则返回true,否则返回false。

【讨论】:

以上是关于WPF中的禁用按钮?的主要内容,如果未能解决你的问题,请参考以下文章

禁用 WPF 窗口标题栏中的关闭按钮 (C#)

如何使用 MVVM 模式“禁用”WPF 中的按钮?

WPF 禁用按钮的背景

如何在 WPF 中禁用按钮上的 MouseOver 效果?

在 WPF 窗口中禁用除一个子控件之外的所有子控件

当我在 WPF(.NET Core)中单击第二个窗口的“确定”按钮时,禁用 MainWindow 按钮并返回到 MainWindow 的初始状态