![](/img/trans.png)
[英]How to disable button and then enable it after textbox.textchanged event?
[英]Enable/disable Button on TextChanged event of TextBox in WPF by XAML
WPF中有TextBox和Button控件:
<TextBox Name="BackUpTextBox" />
<Button Name="BackUpSave" Content="Save" />
如果更改了BackUpTextBox的文本,則必須啟用按鈕BackUpSave。 我知道如何通過C#代碼的BackUpTextBox TextChanged事件來做到這一點。 但是,有沒有一種方法可以通過XAML表示法啟用/禁用按鈕?
您可以通過EventTrigger
實現。 將兩個控件都包裝在StackPanel
以便將TextChanged
事件路由到其父StackPanel中 。
在那種情況下,通過將IsEnabled
設置為True
來啟用Button。
<StackPanel>
<TextBox x:Name="BackUpTextBox"/>
<Button x:Name="BackUpSave" Content="Save" IsEnabled="False"/>
<StackPanel.Triggers>
<EventTrigger RoutedEvent="TextBox.TextChanged">
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsEnabled"
Storyboard.TargetName="BackUpSave">
<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsEnabled"
Storyboard.TargetName="BackUpSave">
<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="False"/>
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsEnabled"
Storyboard.TargetName="BackUpSave">
<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="False"/>
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</StackPanel.Triggers>
</StackPanel>
UPDATE
如果您想再次禁用按鈕單擊按鈕,請為Button.Click
添加另一個事件處理程序,然后將其設置為禁用。 我已經為此更新了xaml代碼。
更新2
解決方案看起來很麻煩,與僅在Initial,TextChanged和Click事件中設置IsEnabled屬性相比,我懷疑它是否值得。 這些天,我是否錯過了一些更喜歡XAML風格的東西?
是的,我必須同意僅XAML的解決方案有時很麻煩,而使用backside代碼可以輕松完成 。 特別是在您的情況下,可以簡單地通過掛接到一些事件來完成操作,更重要的是,這不會違反任何MVVM規則,因為您可以在后面的代碼中查看特定內容 。 因此,我認為從后面的代碼執行ti並沒有什么害處。
在我想將XAML寬松地存儲在某些文本文件中並希望在運行時使用XamlReader.Load()
加載該文件的情況下,我通常會首選XAML解決方案。
正如我提到的那樣,動畫比Dependency屬性的本地值設置器具有更高的優先級。 因此,一旦TextChanged
事件得到提高的值,就將其設置為true,並且后面的代碼對該屬性進行的任何進一步更改都將無效。
但是,無論如何,您都可以通過動畫設置將其從代碼的后面更改(將在此處發布只是為了完整回答,可能會幫助那些偶然發現此帖子的人)。 這是從后面的代碼中執行的方法:
private void Button_BackUpSave_Click(object sender, RoutedEventArgs e)
{
EnableDisableBackUpSaveButton(false);
}
private void EnableDisableBackUpSaveButton(bool value)
{
BooleanAnimationUsingKeyFrames animation =
new BooleanAnimationUsingKeyFrames();
DiscreteBooleanKeyFrame keyFrame = new DiscreteBooleanKeyFrame(value,
KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0)));
animation.KeyFrames.Add(keyFrame);
BackUpSave.BeginAnimation(Button.IsEnabledProperty, animation);
}
現在,在XAML中,您只能在TextChanged
上使用單個XAML觸發器。
您可以使用數據觸發器:
<TextBox Name="BackUpTextBox" />
<Button Name="BackUpSave" Content="Save">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="True" />
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=BackUpTextBox, Path=Text, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Value="{x:Null}">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=BackUpTextBox, Path=Text, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Value="">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
在真實的應用程序中,盡管您不會在XAML中執行此操作,因為無法在單元測試中測試此行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.