C# 如何防止按下按钮时Xamarin.Forms.Entry键盘未聚焦

C# 如何防止按下按钮时Xamarin.Forms.Entry键盘未聚焦,c#,xaml,xamarin,xamarin.forms,C#,Xaml,Xamarin,Xamarin.forms,我基本上是在制作聊天功能,这就是XAML代码片段的样子: <StackLayout Grid.Row="1" Orientation="Horizontal" HeightRequest="50"> <Entry x:Name="ChatField" Text="{Binding CurrentMessageText}" Placeholder="{Binding MessageTextPlaceHolder}" HorizontalOptions="FillAndEx

我基本上是在制作聊天功能,这就是XAML代码片段的样子:

<StackLayout Grid.Row="1" Orientation="Horizontal" HeightRequest="50">
    <Entry x:Name="ChatField" Text="{Binding CurrentMessageText}" Placeholder="{Binding MessageTextPlaceHolder}" HorizontalOptions="FillAndExpand"/>
    <Button Text="send" BackgroundColor="Transparent" Command="{Binding SendMessageCommand}"/>
</StackLayout>
我有一个条目控件和一个按钮控件,它绑定到一个命令,该命令发送chatfield中的文本

我想模仿聊天应用程序的标准,按下发送按钮不会取消焦点或隐藏键盘

不幸的是,现在当我按下“发送”按钮时,它会自动将键盘从输入单元格中解焦

我为防止这种情况而采取的初始步骤是在我拥有的ViewModel SENDMessage命令上:

var chatEntry = CurrentPage.FindByName<Entry>("ChatField");
chatEntry.Focus();
但这会导致将所有列表视图向上推的奇怪行为


存在两种方法请注意,当您按下另一个条目或编辑器时,键盘仍保持不变,因此需要删除“发送”按钮并在其中放置另一个条目。只需传递焦点

et2.Focused += delegate { et1.Focus(); };
另一种方法是只使用一个Mr.signatures.Entry或编辑器,使android ios自定义渲染并检查e.touchs[0].X


但是这种方式需要一个隐藏的输入,因为在iOS[粘贴]菜单上调用了,所以只需传递焦点就可以了。存在两种方式请注意,当您按下另一个输入或编辑器键盘时,键盘仍然保持不变,所以需要删除发送按钮并在那里放置另一个输入。只需传递焦点

et2.Focused += delegate { et1.Focus(); };
另一种方法是只使用一个Mr.signatures.Entry或编辑器,使android ios自定义渲染并检查e.touchs[0].X


但这种方式需要在iOS上调用隐藏的条目原因[paste]菜单,因此只需传递焦点即可解决此问题。

在iOS上使用自定义渲染器:

et2.Focused += delegate { et1.Focus(); };
    public class ChatEntryViewRenderer : EntryRenderer
    {
        protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (e.PropertyName == VisualElement.IsFocusedProperty.PropertyName)
            {
                if (Control != null)
                {
                    var chatEntryView = this.Element as ChatEntryView;
                    Control.ShouldEndEditing = (UITextField textField) =>
                    {
                        return !chatEntryView.KeepOpen; // KeepOpen is a custom property I added and is set on my ViewModel if I want the Entry Keyboard to be kept open then I just set this to true.
                    };
                }
            }

            base.OnElementPropertyChanged(sender, e);
        }
    }

它基本上使用控件的ShouldEndEditing事件,该事件在EditText失去焦点或键盘即将失去焦点时触发。

在IOS上使用自定义渲染器解决了这一问题:

    public class ChatEntryViewRenderer : EntryRenderer
    {
        protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (e.PropertyName == VisualElement.IsFocusedProperty.PropertyName)
            {
                if (Control != null)
                {
                    var chatEntryView = this.Element as ChatEntryView;
                    Control.ShouldEndEditing = (UITextField textField) =>
                    {
                        return !chatEntryView.KeepOpen; // KeepOpen is a custom property I added and is set on my ViewModel if I want the Entry Keyboard to be kept open then I just set this to true.
                    };
                }
            }

            base.OnElementPropertyChanged(sender, e);
        }
    }

它基本上使用控件的ShouldEndEditing事件,该事件在编辑文本失去焦点或键盘即将失去焦点时触发。

最简单的方法是使用与按钮不同的项目,例如BoxView,并在其上附加TapGestureListener

如果要保留按钮的外观,可以将具有透明背景的BoxView放在按钮顶部

致以最良好的祝愿,
Marco

最简单的方法是使用与按钮不同的项目,例如BoxView,并在其上附加TapGestureListener

如果要保留按钮的外观,可以将具有透明背景的BoxView放在按钮顶部

致以最良好的祝愿,
Marco

这不起作用,而且这种架构使用隐藏条目有点奇怪。找到了一个自定义呈现IOS EntryRenderer的解决方案。这不起作用,而且使用隐藏项有点奇怪。找到了一个解决方案,该解决方案可自定义呈现IOS的EntryRenderer。