web-dev-qa-db-fra.com

Désactiver le bouton dans WPF?

J'ai un bouton et une zone de texte dans mon application WPF. Comment puis-je désactiver le bouton jusqu'à ce que l'utilisateur entre du texte dans la zone de texte?

48
sanjeev40084

Cela devrait le faire:

<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>
46
Steve Greatrex

Dans MVVM (ce qui rend beaucoup de choses beaucoup plus faciles - vous devriez l'essayer), vous auriez deux propriétés dans votre ViewModel Text qui est lié à votre TextBox et vous auriez une propriété ICommand Apply (ou similaire) qui est liée au bouton:

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

L'interface ICommand a une méthode CanExecute qui vous permet de renvoyer trueif (!string.IsNullOrWhiteSpace(this.Text). Le reste est fait par WPF pour vous (activation/désactivation, exécution de la commande réelle au clic).

L'article lié l'explique en détail.

19
bitbonk

Par code:

btn_edit.IsEnabled = true;

Par XAML:

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

Je sais que ce n'est pas aussi élégant que les autres articles, mais c'est un exemple plus simple de xaml/codebehind sur la façon d'accomplir la même chose.

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>

CodeBehind:

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
5
spong

Vous pouvez vous abonner à l'événement TextChanged sur le TextBox et si le texte est vide, définissez le Button sur désactivé. Ou vous pouvez lier le Button.IsEnabled propriété à TextBox.Text et utilisez un convertisseur qui renvoie true s'il y a du texte et false sinon.

0
Charlie