Добавить и привязать 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 на внешнем дисплее для обновления.
- Использование MvxMessenger. - Я попытался передать сообщение как новой ViewModel, так и самому View. Новый ViewModel получил сообщение только после того, как я создал новый экземпляр из публикуемой модели представления. Тем не менее, я никогда не мог перехватить сообщения прямо из представления...
- Задержка привязки и регулярное плавное связывание, когда свойства связанной модели представления просто обновляются из другой модели представления.
- Попытка связать это представление с моделью представления, уже связанной с другим представлением.
- Желание в одной руке, а в другой - треск... Угадай, кто первым заполнил;)
Это почти как если бы 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.