iOS端键盘打开时Xamarin Button点击无法触发SendMessage求助
我使用Microsoft.UI.Xaml.Controls.Grid布局了一个包含TextBox和Button的聊天输入界面,XAML代码如下:
<Grid Margin="16" CornerRadius="12" Background="{StaticResource Color08Brush}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <TextBox Grid.Column="0" PlaceholderText="Write a message…" Margin="12,12,4,12" MaxHeight="92" TextWrapping="Wrap" Text="{Binding [Input], Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource ChatTextBoxStyle}" /> <Button Grid.Column="1" Command="{Binding [SendMessage]}" Style="{StaticResource EllipseButtonStyle}" Background="{StaticResource Color11Brush}" Width="44" Height="44" Margin="0,0,12,0" IsTabStop="False"> <u:PathControl Style="{StaticResource ForwardArrowPathStyle}" Width="8" /> </Button> </Grid>
该功能在Android端运行正常,但iOS端存在异常:当TextBox获取焦点弹出键盘后,点击Button仅会收起键盘,无法触发绑定的SendMessage命令。已尝试设置ios:VisualElement.CanBecomeFirstResponder="True",问题仍未解决。
可行解决方案:
方法一:手动处理TextBox焦点后执行命令
在SendMessage命令的执行逻辑开头,先强制让TextBox失去焦点,再执行发送逻辑:// 假设InputTextBox是页面中的TextBox实例 if (InputTextBox.FocusState != FocusState.Unfocused) { InputTextBox.Focus(FocusState.Unfocused); } // 执行消息发送的核心逻辑方法二:配置iOS平台触摸响应属性
为Button添加iOS平台特定的交互属性,确保其优先接收触摸事件:<Button Grid.Column="1" Command="{Binding [SendMessage]}" Style="{StaticResource EllipseButtonStyle}" Background="{StaticResource Color11Brush}" Width="44" Height="44" Margin="0,0,12,0" IsTabStop="False"> <u:PathControl Style="{StaticResource ForwardArrowPathStyle}" Width="8" /> <Button.iOS> <ios:VisualElement.CanBecomeFirstResponder>True</ios:VisualElement.CanBecomeFirstResponder> <ios:UIViewProperties.UserInteractionEnabled>True</ios:UIViewProperties.UserInteractionEnabled> </Button.iOS> </Button>同时检查Grid及父容器的
ios:UIViewProperties.UserInteractionEnabled是否设为True。方法三:自定义iOS Button Renderer
编写自定义Renderer,确保Button在键盘弹出时能正确响应点击:[assembly: ExportRenderer(typeof(Button), typeof(ChatButtonRenderer))] namespace YourAppNamespace.iOS.Renderers { public class ChatButtonRenderer : ButtonRenderer { protected override void OnElementChanged(ElementChangedEventArgs<Button> e) { base.OnElementChanged(e); if (Control != null) { Control.UserInteractionEnabled = true; Control.ExclusiveTouch = false; } } } }
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

