Добавить и привязать UIView на внешний монитор с помощью MvvmCross

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

        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. Большая часть тяжелой работы по определению того, какими должны быть значения, уже выполняется на другой модели представления, которая обновляет представление, прикрепленное к экрану телефона. Я попробовал несколько методов, чтобы попытаться получить UIView на внешнем дисплее для обновления.

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

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

   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;
    }
}

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

1 ответ

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

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

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

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

Другие вопросы по тегам