2013-07-02 2 views
0

Я пытаюсь отобразить UIView на внешнем мониторе в iOS, если он обнаружен. Я могу обнаружить и отобразить простой UIView, используя следующий код ...Добавить и связать UIView на внешнем мониторе с помощью MvvmCross

 public void CheckForExternalDisplay() 
    { 
     if (UIScreen.Screens.Length > 1) 
     { 
      Mvx.Trace(MvxTraceLevel.Diagnostic, "Multiple screens found"); 
      var externalScreen = UIScreen.Screens[1]; 
      var rect = new RectangleF(new PointF(0, 0), externalScreen.AvailableModes.Max(m => m).Size); 
      var window = new UIWindow(rect) 
       { 
        Screen = UIScreen.Screens[1], 
        ClipsToBounds = true, 
        Hidden = false 
       }; 

      var presenterView = new PresenterView(rect); 
      window.AddSubview(presenterView); 
     } 

    } 

Этот UIView очень прост. Он содержит UILabel и RadialProgress View. Большая часть тяжелого подъема для определения того, какие значения должны быть сделаны, уже выполняется на другой модели, которая обновляет вид, прикрепленный к экрану телефона. Я попробовал несколько методов, чтобы попытаться обновить UIView на внешнем дисплее.

  1. Использование MvxMessenger. - Я попытался передать сообщение как новому, так и самому представлению ViewModel. Новый ViewModel получил сообщение только после того, как я создал новый экземпляр из модели представления публикации. Тем не менее, я никогда не мог перехватывать сообщения непосредственно из представления ...
  2. Связывание с задержкой и регулярное плавное связывание, где свойства связанной видовой моды просто обновляются с другой модели.
  3. Попытка связать этот вид с помощью модели, уже связанной с другим видом.
  4. Желая в одной руке, и crapping в другой ... Угадайте, один заполненный первым;)

Это почти как если UIView (ниже), не регистрируется/связано с ViewModel , Я уверен, что где-то кое-что не хватает. Как всегда, я ценю помощь!

public sealed class PresenterView 
    : MvxView 
{ 
    private readonly RadialProgressView _progressView; 
    private readonly MvxSubscriptionToken _token; 
    private IMvxMessenger _messenger; 
    private UILabel _displayLabel; 

    public PresenterView(RectangleF frame) 
     : base(frame) 
    { 
     Frame = frame; 

     _messenger = Mvx.Resolve<IMvxMessenger>(); 
     _token = _messenger.Subscribe<DisplayMessage>(OnDisplayMessageReceived); 

     _displayLabel = new UILabel 
      { 
       AdjustsFontSizeToFitWidth = true, 
       Lines = 1, 
       LineBreakMode = UILineBreakMode.TailTruncation, 
       Text = "This is a workout", 
       Font = UIFont.FromName("rayando", 96f), 
       BackgroundColor = UIColor.Clear, 
       PreferredMaxLayoutWidth = Frame.Width - 10, 
       Frame = new RectangleF(0, 0, Frame.Width - 10, frame.Height/7), 
       TextColor = UIColor.White, 
       TextAlignment = UITextAlignment.Center, 
       AutoresizingMask = UIViewAutoresizing.All 
      }; 

     AddSubview(_displayLabel); 

     _progressView = new RadialProgressView 
      { 
       Center = new PointF(Center.X, Center.Y), 
       MinValue = 0f, 
      }; 

     AddSubview(_progressView); 

     this.DelayBind(() => 
      { 
     MvxFluentBindingDescriptionSet<PresenterView, PresenterViewModel> set = 
      this.CreateBindingSet<PresenterView, PresenterViewModel>(); 
     set.Bind(_progressView).For(pv => pv.Value).To(vm => vm.ClockValue); 
     set.Bind(_progressView).For(pv => pv.MaxValue).To(vm => vm.MaxProgress); 
     set.Bind(_workoutLabel).To(vm => vm.DisplayText); 
     set.Apply(); 
      }); 
    } 

    private void OnDisplayMessageReceived(DisplayMessage obj) 
    { 
     _workoutLabel.Text = obj.Message; 
    } 
} 

Я действительно понимаю, что здесь были включены оба решения. Я пробовал каждый из них самостоятельно.

ответ

0

Из кода, который вы опубликовали, я не вижу нигде, где вы фактически устанавливаете контекст данных для своего вида.

В 'нормальном mvvmcross' либо:

  • MvxViewController создает свой собственный DataContext (ViewModel), используя свое шоу запрос в viewDidLoad
  • другой код приложения устанавливает DataContext давал MvxView, основанный на app- определенной логике - см п = 32 в http://mvvmcross.wordpress.com в качестве примера

в вашем коде, я не могу в настоящее время увидеть, где вы установите это - так попытайтесь установить view.DataContext где-то.

+0

Спасибо за помощь! Я попытался установить контекст данных, как было предложено, но все равно не повезло. В основном, я сделал, чтобы создать экземпляр представления, который отображается на внешнем экране в событии ViewDidLoad другого представления, которое имеет внешний вид ViewModel как свойство. Затем я привязал внешний вид DataContext к этому свойству, но ни одна из данных, похоже, не обновляется. Это потому, что представление, которое я пытаюсь обновить, фактически находится на другом Window/UIScreen? – blakeD

+0

«Я пробовал ... Я тогда связался ... Это потому, что ...?». Извините - это слишком сложно для подражания. Попробуйте найти трассировку отладки, попробуйте включить в свой вопрос больше кода, поставив точки останова и посмотрев, какие переменные, попробуйте опубликовать полное репо. Извините - я нахожу детали в комментариях, которые очень трудно читать - им просто гораздо труднее читать и понимать, чем полные вопросы/ответы здесь. – Stuart

+0

Стюарт - Еще раз ценю обратную связь! Прошу прощения за путаницу, которую я создал, добавив слишком много деталей в комментарии. Я создал простой проект, который отражает то, что я пытаюсь выполнить, но все равно получаю те же результаты. Я подталкиваю проект к GitHub. Я могу найти следующий [link] (https: // github.ком/davidsonblake/SimpleExternalScreen) – blakeD