2015-02-21 3 views
1

Моего текущего набор вверх:Xamarin форма Динамически загружать содержимое в странице

Xamarin форму, состоящая из прошивки, Android, WP приложения и общего PCL. Использование MVVM Light для обеспечения хорошего разделения проблем.

Краткое введение в то, чего я хочу достичь. Я хочу иметь базовую страницу с кнопкой «Отмена» и «Далее». При нажатии кнопки «Далее» содержимое загружается динамически на этой базовой странице.

Xaml Вид:

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="LogInPresenterView"> 
    <ContentPage.ToolbarItems> 
    <ToolbarItem Text="Cancel" Priority="0" Order="Primary" Command="{Binding Cancel}"></ToolbarItem> 
    <ToolbarItem Text="Next" Priority="1" Order="Primary" Command="{Binding Next}"></ToolbarItem> 
    </ContentPage.ToolbarItems> 
</ContentPage> 

ViewModel Код:

public class LogInPresenterViewModel : ViewModelBase 
    { 

     public LogInPresenterViewModel() {} 

     private RelayCommand _next; 
     public RelayCommand Next 
     { 
      get 
      { 
       return _next ?? (_next = new RelayCommand(async() => await DoNext())); 
      } 
     } 

     private async Task DoNext() 
     { 
      // IN HERE I WOULD LIKE TO DYNCAMICALLY LOAD CONTENT/VIEWS 
     } 

    } 

Обычно вы бы StackLayout и т.д. перед элементом. Однако при нажатии на элемент Next Toolbar я хочу динамически загружать контент (который имеет viewmodel).

Так что, может быть, моя ICommand для моей следующей кнопки проверена, чтобы узнать, что такое текущий тип контента, и в зависимости от этого я бы загрузил еще один бит контента.

Сценарий будет, базовая страница будет загружаться вместе с первым битом содержимого - Введите адрес электронной почты и пароль. Пользователь вводит это, а затем щелкает дальше, если все в порядке, содержимое заменяется на вариант, чтобы ввести защитный код, удерживая кнопки «Закрыть» и «Далее» вверху.

Надеюсь, это имеет смысл. Я знаю, что хочу делать в моей голове, я просто не знаю, как перевести это в формы Xamarin ...

ответ

0

Так что, если это был я. Я бы создал региональную службу, где contentview регистрирует уникальное имя региона.

Содержимое будет помечено для использования в этом регионе, а пользовательский презентатор может использоваться для отображения содержимого модели представления в соответствующей области.

Я на своем телефоне во время путешествия в данный момент, но я могу отправить код позже, если это помогает :)

Тристана

+0

Было бы здорово, если бы вы могли предоставить некоторый код ... Я немного застрял в данный момент, и это будет оценено. Я создал LogInPresenterView ... так что похоже, что я начал в правильном направлении. – dotnethaggis

1

Хорошо,

Так первая работа заключается в создании вашего региона в вашем PCL. Это будет выглядеть примерно так:

using System; 
using System.Collections.Generic; 

namespace xxx 
{ 
    public class RegionService : IRegionService 
    { 
     private Dictionary<string, object> _regionDictionary; 

     public RegionService() 
     { 
      _regionDictionary = new Dictionary<string, object>(); 
     } 

     #region IRegionService implementation 

     public bool RegisterRegion (string regionName, object regionObject) 
     { 
      object region = null; 

      _regionDictionary.TryGetValue (regionName, out region); 
      if (region != null) 
       _regionDictionary [regionName] = regionObject; 
      else 
       _regionDictionary.Add (regionName, regionObject); 
      return true; 
     } 

     public object ResolveRegion (string regionName) 
     { 
      object region = null; 

      _regionDictionary.TryGetValue (regionName, out region); 

      if (region == null) 
       throw new RegionServiceException ("Unable to resolve region with given name"); 

      return region; 
     } 

     #endregion 
    } 
} 

В этом при создании страницы с динамическим содержимым зарегистрировать динамический contentview в коде позади:

ContentView contentView = this.FindById<ContentView>("myContentView"); 
regionService.RegisterRegion("DynamicView", contentView); 

Вам нужно создать интерфейс для вашего представления и страницы, чтобы использовать, чтобы указать, в каком регионе они хотят быть представлены в виде:

using System; 

namespace xxx 
{ 
    public interface IRegionView 
    { 
     string GetRegionName(); 
    } 
} 

Затем в коде позади вашего зрения реализовать этот интерфейс, чтобы вернуть имя из регион для отображения.

Теперь вам нужен пользовательский презентатор, чтобы использовать этот код региона.Я использую MVVMCross, поэтому детали будут отличаться для реализации MVVM вы используете, но, по существу что-то вроде этого является то, что вам нужно:

public async static Task PresentPage(Page page) 
{ 

    if (typeof(IRegionView).GetTypeInfo().IsAssignableFrom(page.GetType().GetTypeInfo())) 
    { 

     IRegionService regionService = Mvx.Resolve<IRegionService>(); 
     string regionName = (page as IRegionView).GetRegionName(); 
     Page region = regionService.ResolveRegion(regionName) as Page; 

     if (typeof(IModalPage).GetTypeInfo().IsAssignableFrom(page.GetType().GetTypeInfo())) 
      await region.Navigation.PushModalAsync(page); 

     else if (typeof(IPopupPage).GetTypeInfo().IsAssignableFrom(page.GetType().GetTypeInfo())) 
      region.PushOverlayPage(page); 

     else if (typeof(NavigationPage).GetTypeInfo().IsAssignableFrom(region.GetType().GetTypeInfo())) 
      await (region as NavigationPage).PushAsync(page); 

    } 
} 

Я надеюсь, что это полезно для вас :)

+0

Привет, Тристан, спасибо за это. Я не уверен, что это то, что мне нужно, но я подробно рассмотрю, когда вернусь домой. Возможно, я неправильно описал проблему. Спасибо за предоставление кода и т. Д. – dotnethaggis

0

Вы можете динамически загрузить Xamarin Forms UI с помощью XAML. Если вы клонировать этот репозиторий, вы можете увидеть пример динамически оказанной UI из XAML здесь: https://github.com/MelbourneDeveloper/Adapt.Presentation

Старый Ответ: Это может быть достигнуто с использованием метода LoadFromXaml. Он работает так же, как XamlReader.Load в Silverlight/WPF. Это скрытый метод, к которому можно получить доступ только через отражение. Существует статья о том, как сделать это здесь: http://www.cazzulino.com/dynamic-forms.html

Но, я хотел бы попросить, чтобы вы идете на эту просьбу признака в Xamarin и спросить, что метод будет обнародован так, чтобы она стала полностью поддерживается функцией: https://forums.xamarin.com/discussion/comment/252626

Смежные вопросы