CollectionView内Button的Visual State Manager不生效问题
问题原因&解决方法
你当前的代码核心问题是自定义了视觉状态组名称,Button的内置交互状态归属系统预设的CommonStates组,自定义组名无法被系统识别触发状态变更。
方案1:仅需按下瞬间变色
直接修改视觉状态组的名称为CommonStates即可生效,示例修正代码如下:
<Button Padding="15" CornerRadius="10" BorderColor="Black" BorderWidth="1" TextColor="Black" CommandParameter="{Binding .}" Command="{Binding Source={x:Reference browse}, Path=BindingContext.CitySelectedCommand}" BackgroundColor="Transparent" Text="{Binding name}" HeightRequest="30" VerticalOptions="Start" HorizontalOptions="FillAndExpand"> <VisualStateManager.VisualStateGroups> <!-- 替换为系统内置的CommonStates组 --> <VisualStateGroup x:Name="CommonStates"> <VisualState x:Name="Normal"> <VisualState.Setters> <Setter Property="TextColor" Value="Black"/> <Setter Property="BackgroundColor" Value="Transparent"/> </VisualState.Setters> </VisualState> <VisualState x:Name="Pressed"> <VisualState.Setters> <Setter Property="TextColor" Value="Red"/> <!-- 如需修改背景色也可以在这里加对应Setter --> </VisualState.Setters> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> </Button>
如果安卓端出现自带水波纹效果覆盖你设置的颜色,可以在Button节点加android:RippleEffect.Color="@android:color/transparent"关闭默认水波纹
方案2:点击后保持选中状态(松开后颜色不变)
Pressed状态仅在按住按钮时生效,松开就会回到Normal状态,如果需要实现选中后常驻变色,需要改动数据层:
- 给你的Suburb对应的Model类添加
IsSelected布尔属性,实现INotifyPropertyChanged接口,属性变更时触发通知 - 按钮的TextColor绑定该属性,配合值转换器实现状态切换:
<Button TextColor="{Binding IsSelected, Converter={StaticResource BoolToColorConverter}, ConverterParameter=Red|Black}" .../> - 在
CitySelectedCommand的执行逻辑里,遍历所有Suburbs项,把全部项的IsSelected设为false,再把当前点击的项的IsSelected设为true即可
内容的提问来源于stack exchange,提问作者helper
相关产品推荐
相关产品推荐

