Xamarin.Forms从mvvm ViewModel设置焦点

时间:2017-02-11 13:03:46

标签: c# xamarin xamarin.forms freshmvvm

我正在使用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();

}

2 个答案:

答案 0 :(得分:2)

这可以通过使用PCL内的FindByName<>()功能轻松实现 这是这样做的一种方式:

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因为我没有完成自定义条目的所有实现。

答案 1 :(得分:1)

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

在xaml中,你需要给你想要聚焦的obj一个x:Name。

l^2

然后你必须在一个按钮的命令参数中引用该控件,或者例如在这种情况下我使用一个工具栏项。

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

然后在你的vm命令中:

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