Запись автофокуса, когда она видна или включена в формах xamarin с использованием пользовательских средств визуализации - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть страница, на которой я отображаю список элементов в виде списка, в котором есть нижний колонтитул.Нижний колонтитул списка виден только в определенных условиях.Вот нижний колонтитул списка, который имеет запись.

<listview:SfListView.FooterTemplate>
    <DataTemplate>
        <Grid Padding="15,5,10,10" IsVisible="{Binding NewListEntryVisible}">
            <Grid.RowDefinitions>
                <RowDefinition Height="50"/>
            </Grid.RowDefinitions>    
            <local:AutoFocusEntry ReturnType="Done" IsVisible="{Binding NewListEntryVisible}" Grid.Row="0" IsEnabled="{Binding FocusEntry}" Text="{Binding cartName}" x:Name="NewListEntry" Placeholder="Enter list name">
                <local:AutoFocusEntry.Behaviors>
                    <behaviors:EventToCommandBehavior                    
                        EventName="Completed"
                        Command="{Binding NewListCommand}" />
                </local:AutoFocusEntry.Behaviors>
            </local:AutoFocusEntry>    
        </Grid>    
    </DataTemplate>    
</listview:SfListView.FooterTemplate>

Как только нижний колонтитул станет видимым (как я уже говорил, он виден в зависимости от определенных условий), я хочу, чтобы запись в нижнем колонтитуле автоматически фокусировалась.Как мне добиться этого, используя Entry Custom Renderer.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Решил мою проблему, вызвав метод для фокусировки на пользовательских средствах визуализации

Пользовательский ввод:

public class AutoFocusEntry : Entry
    {
        public AutoFocusEntry()
        {
        }
    }
}

CustomRenderer в Android:

[assembly: ExportRenderer(typeof(AutoFocusEntry), typeof(AutoFocusEntryRenderer))]
namespace Test.Mobile.Droid.CustomRenderers
{
    public class AutoFocusEntryRenderer : EntryRenderer
    {
        public AutoFocusEntryRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            MocoAutoFocusEntry entry = (MocoAutoFocusEntry)this.Element;

            if (this.Control != null && e.PropertyName == "IsVisible")
            {
                if (entry != null && entry.IsVisible)
                {
                    Control.RequestFocus();
                    InputMethodManager inputMethodManager = this.Control.Context.GetSystemService(Android.Content.Context.InputMethodService) as InputMethodManager;
                    inputMethodManager.ShowSoftInput(this.Control, ShowFlags.Forced);
                    inputMethodManager.ToggleSoftInput(ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly);
                }
            }
        }
    }
}

CustomRenderer в iOS:

[assembly: ExportRenderer(typeof(AutoFocusEntry), typeof(AutoFocusEntryRenderer))]
namespace Test.Mobile.iOS.CustomRenderers
{
    public class AutoFocusEntryRenderer : EntryRenderer
    {
        public AutoFocusEntryRenderer()
        {
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            MocoAutoFocusEntry entry = (MocoAutoFocusEntry)this.Element;

            if (this.Control != null && e.PropertyName == "IsEnabled")
            {
                if (entry != null && entry.IsVisible)
                {
                    Control.BecomeFirstResponder();
                }
            }

            if (this.Control != null && e.PropertyName == "IsVisible")
            {
                if (entry != null && entry.IsVisible)
                {
                    Control.BecomeFirstResponder();
                }
            }
        }
    }
}

На основании PropertyName (IsVisible & IsEnabled) я получаю фокус на запись

0 голосов
/ 18 сентября 2018

Вы хотите прослушать событие изменения свойства в поле ViewModel, которое показывает или скрывает нижний колонтитул.

Дайте имя вашей записи:

 <local:AutoFocusEntry x:Name="yourEntry"

На вашей странице.xaml.cs прослушивает желаемое событие изменения свойства, чтобы вызвать событие Focus для записи:

yourViewModel.PropertyChanged += (sender, args) => {
    if (args.PropertyName.Equals("YourPropertyIsVisible"))
       yourEntry.Focus();

};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...