在您尝试立即撤消请求的操作或状态更改之前,这一切都很好。
根据您的描述,您的代码可能如下所示:
public async Task Start()
{
await DoSomething()
IsChecked = true;
}
当任务中断或快速切换时,不能保证按钮的状态会改变。
我的建议是使用VisualStateManager将按钮的可视化表示与逻辑代码分开,以保证按钮的即时响应。
首先创建一个名为VCRButtonGroups
的
UserControl
VCRButtonGroups.xaml
<Grid>
<StackPanel Orientation="Horizontal">
<ToggleButton Content="Pause" x:Name="PauseButton" Tapped="PauseButton_Tapped"/>
<ToggleButton Content="Start" x:Name="StartButton" Margin="15,0,0,0" Tapped="StartButton_Tapped"/>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="Pause">
<VisualState.Setters>
<Setter Target="StartButton.IsChecked" Value="False"/>
<Setter Target="PauseButton.IsChecked" Value="True"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Start">
<VisualState.Setters>
<Setter Target="StartButton.IsChecked" Value="True"/>
<Setter Target="PauseButton.IsChecked" Value="False"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</StackPanel>
</Grid>
VCRButtonGroups.xaml.cs
private void PauseButton_Tapped(object sender, TappedRoutedEventArgs e)
{
VisualStateManager.GoToState(this, "Pause",false);
// Do other
}
private void StartButton_Tapped(object sender, TappedRoutedEventArgs e)
{
VisualStateManager.GoToState(this, "Start", false);
// Do other
}
这只是一个带有两个按钮的示例,您可以根据此代码添加新按钮。这样做的好处是可以预设一组状态,然后根据不同的触发条件进入不同的状态,保证UI可以正确显示。
最好的问候。