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(.NET Core)中单击第二个窗口的“确定”按钮时,禁用 MainWindow 按钮并返回到 MainWindow 的初始状态