3

我正在使用 Xamarin.Forms 开发一个聊天应用程序。

而且我想避免在条目失去焦点并单击按钮发送时隐藏键盘。

我怎样才能在 Android 和 iOS 上做到这一点?

我使用 XF,不带 XAML 的完整 Mvvm(仅 C#)

更新:

在页面类中:

private EntrySetBorder _newMessageEntry;
...
_newMessageEntry = new EntrySetBorder
{
    TextColor = Color.Black,
    HorizontalOptions = LayoutOptions.FillAndExpand,
    VerticalOptions = LayoutOptions.End,
    Margin = new Thickness(0, 0, 5, 0)
};

在模型类中:

var entry = CurrentPage.FindByName<EntrySetBorder>("_newMessageEntry");
entry.Focus();

}

4

2 回答 2

2

这可以通过使用FindByName<>()PCL 中的函数轻松实现。
这是这样做的一种方法:

Entry myEntry = CurrentPage.FindByName<Entry>("YourEntryName");
myEntry.Focus();

您可以将其添加到发送按钮的单击处理程序的末尾。

编辑:

在您的情况下,我认为您的问题是您的条目设置为private,因此我建议将其公开为public或使用另一个公共属性公开。两种可能有效的解决方案:

public EntrySetBorder _newMessageEntry;
...
_newMessageEntry = new EntrySetBorder
{

    TextColor = Color.Black,
    HorizontalOptions = LayoutOptions.FillAndExpand,
    VerticalOptions = LayoutOptions.End,
    Margin = new Thickness(0, 0, 5, 0)
};

和:

EntrySetBorder entry = CurrentPage.FindByName<EntrySetBorder>("_newMessageEntry");
entry.Focus();

或者你可以这样做:

private EntrySetBorder _newMessageEntry;
...
_newMessageEntry = new EntrySetBorder
{

    TextColor = Color.Black,
    HorizontalOptions = LayoutOptions.FillAndExpand,
    VerticalOptions = LayoutOptions.End,
    Margin = new Thickness(0, 0, 5, 0)
};
public EntrySetBorder NewMessageEntry => _newMessageEntry;

和 :

EntrySetBorder entry = CurrentPage.FindByName<EntrySetBorder>("NewMessageEntry");
entry.Focus();

请尝试:)

编辑2:

在检查了您的代码并对其进行测试后,修复它的最后一种方法是将条目作为您正在使用的命令中的参数发送,例如:

在您正在创建的页面内:

sendButton.CommandParameter = NewMessageEntry; // We're adding the Entry we want to focus as a command parameter.

在您的 PageModel 和我们要使用的命令中:

public Command SendCommand
{
    get
    {
        return new Command<Entry>((obj) => //obj here means the parameters we're sending I.E: the entry we set it in the page.
        {
            //The code you want to execute
            Entry entry = obj;
            entry.Focus();
        });
    }
}

请注意,我之所以使用Entry,是因为我没有您的自定义条目的所有实现。

于 2017-02-12T10:47:32.580 回答
1

这是我如何做的一个例子,在此之前我曾经使用 MessagingCenter

在 xaml 中,您需要为要聚焦的 obj 提供一个 x:Name 。

<!-- PICKER's DEFINITION -->
<DatePicker
    x:Name="Datepicker"
    Date="{Binding SelectedDate, Mode=TwoWay}"
    IsEnabled="true"
    IsVisible="false">
</DatePicker>

那么您必须在按钮上的命令参数中引用该控件,或者例如在这种情况下我使用工具栏项。

<!-- MENU TOOLBAR -->
<ContentPage.ToolbarItems>
    <ToolbarItem
        Command="{Binding ShowCalendarCommand}"
        Icon="Calendar"
        CommandParameter="{x:Reference Datepicker}" />
</ContentPage.ToolbarItems>

然后在你的 vm 命令中:

    #region toolbar commands

    public ICommand ShowCalendarCommand => new RelayCommand<Object>(ShowCalendar);

    #endregion

    private void ShowCalendar(Object obj)
    {
        var calendar = (DatePicker)obj;
        calendar.Focus();
        //  MessagingCenter.Send(this, "Calendar");
    }
于 2017-09-05T13:00:19.977 回答