WinUI 3中RatingControl设为0星失败,显示1星该如何解决?
RatingControl设置为0星却显示1星的原因及解决方法
你遇到的问题是:点击「清除评分」按钮后,明明把mainRating.Value设为了0.0,但UI里的RatingControl始终显示1星,核心原因是事件触发顺序和未对0值做判断:
当你设置mainRating.Value = 0.0时,会立刻触发ValueChanged事件,而你的事件处理代码不管当前评分是多少,直接把清除按钮设为Visible。再加上RatingControl开启了IsClearEnabled="True",设置0值时控件内部逻辑会和事件触发产生冲突,最终导致评分被意外重置为1星。
你的现有代码
XAML代码
<StackPanel Orientation="Horizontal" Grid.Column="1" Grid.Row="4"> <RatingControl x:Name="mainRating" Margin="5, 10, 10, 0" HorizontalAlignment="Left" VerticalAlignment="Center" VerticalContentAlignment="Center" AutomationProperties.Name="Simple RatingControl" IsClearEnabled="True" IsReadOnly="False" ValueChanged="MainRating_ValueChanged" /> <Button x:Name="clearRatingButton" Content="Clear Rating" Click="ClearRatingButton_Click" Visibility="Collapsed" /> </StackPanel>
后台代码
private void ClearRatingButton_Click(object sender, RoutedEventArgs e) { mainRating.Value = 0.0; clearRatingButton.Visibility = Visibility.Collapsed; } private void MainRating_ValueChanged(RatingControl sender, object args) { clearRatingButton.Visibility = Visibility.Visible; }
两种解决方法
方法一:在ValueChanged事件中判断评分值
修改ValueChanged事件处理代码,只有当评分大于0时才显示清除按钮,这样设置0值时按钮会自动隐藏,同时避免控件内部逻辑冲突:
private void MainRating_ValueChanged(RatingControl sender, object args) { // 只有评分大于0时才显示清除按钮 clearRatingButton.Visibility = sender.Value > 0 ? Visibility.Visible : Visibility.Collapsed; }
方法二:设置Value时临时取消事件订阅
在清除评分时,先移除ValueChanged事件订阅,设置完0值后再重新订阅,避免事件触发干扰设置操作:
private void ClearRatingButton_Click(object sender, RoutedEventArgs e) { // 临时移除事件订阅 mainRating.ValueChanged -= MainRating_ValueChanged; mainRating.Value = 0.0; clearRatingButton.Visibility = Visibility.Collapsed; // 重新订阅事件 mainRating.ValueChanged += MainRating_ValueChanged; }
两种方法都能解决你的问题,推荐用方法一,逻辑更清晰,也更符合控件的交互逻辑。
内容的提问来源于stack exchange,提问作者Ethan Allen
相关产品推荐
相关产品推荐

