Xamarin Forms安卓平台Entry应用含Focused视觉状态样式后需双击触发问题
根因说明
该问题是Xamarin.Forms安卓端的已知兼容性bug:当Visual State Manager在Focused状态中修改FontAttributes这类会触发控件重绘的属性时,第一次点击的焦点事件会被重绘逻辑打断,导致输入法无法弹出,第二次点击时控件已完成重绘,焦点即可正常触发。此外你当前的样式中额外定义了Entry不支持的Selected视觉状态,会进一步干扰状态机切换逻辑,放大异常。
解决方案(按实现成本从低到高排序)
方案1:移除冗余的Selected状态
Entry控件的CommonStates视觉状态组仅支持Normal、Disabled、Focused三个状态,你代码中配置的Selected属于无效状态,优先尝试删除该段代码即可解决90%以上的同类问题:
<!-- 移除这段冗余配置 --> <VisualState Name="Selected"> <VisualState.Setters> <Setter Property="TextColor" Value="{StaticResource Color_Text_OnWhite}" /> <Setter Property="FontAttributes" Value="Bold"/> </VisualState.Setters> </VisualState>
方案2:替换VSM的Focused属性修改逻辑
如果删除Selected后问题仍存在,可放弃在VSM中配置Focused状态的FontAttributes,改用事件订阅实现样式切换:
- XAML中为Entry绑定焦点事件:
<Entry Focused="Entry_Focused" Unfocused="Entry_Unfocused"/>
- 后台代码实现事件逻辑:
private void Entry_Focused(object sender, FocusEventArgs e) { if (sender is Entry entry) { entry.FontAttributes = FontAttributes.Bold; } } private void Entry_Unfocused(object sender, FocusEventArgs e) { if (sender is Entry entry) { entry.FontAttributes = FontAttributes.None; } }
如果需要全局复用该逻辑,可封装为附加属性或Behavior。
方案3:自定义渲染器强制处理焦点
如果必须保留VSM的原有配置,可通过安卓平台自定义渲染器强制处理点击时的焦点和输入法弹出逻辑:
using Android.Content; using Android.Views.InputMethods; using Xamarin.Forms; using Xamarin.Forms.Platform.Android; [assembly: ExportRenderer(typeof(Entry), typeof(你自己的命名空间.FixedEntryRenderer))] namespace 你自己的命名空间 { public class FixedEntryRenderer : EntryRenderer { public FixedEntryRenderer(Context context) : base(context) { } protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) { base.OnElementChanged(e); if (Control != null) { Control.Click += (s, args) => { Control.RequestFocus(); var imm = Context.GetSystemService(Context.InputMethodService) as InputMethodManager; imm?.ShowSoftInput(Control, ShowFlags.Implicit); }; } } } }
内容的提问来源于stack exchange,提问作者Nicola Schüepp
相关产品推荐
相关产品推荐

