Я пытаюсь отобразить 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 на внешнем дисплее.
- Использование MvxMessenger. - Я попытался передать сообщение как новому, так и самому представлению ViewModel. Новый ViewModel получил сообщение только после того, как я создал новый экземпляр из модели представления публикации. Тем не менее, я никогда не мог перехватывать сообщения непосредственно из представления ...
- Связывание с задержкой и регулярное плавное связывание, где свойства связанной видовой моды просто обновляются с другой модели.
- Попытка связать этот вид с помощью модели, уже связанной с другим видом.
- Желая в одной руке, и 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;
}
}
Я действительно понимаю, что здесь были включены оба решения. Я пробовал каждый из них самостоятельно.
Спасибо за помощь! Я попытался установить контекст данных, как было предложено, но все равно не повезло. В основном, я сделал, чтобы создать экземпляр представления, который отображается на внешнем экране в событии ViewDidLoad другого представления, которое имеет внешний вид ViewModel как свойство. Затем я привязал внешний вид DataContext к этому свойству, но ни одна из данных, похоже, не обновляется. Это потому, что представление, которое я пытаюсь обновить, фактически находится на другом Window/UIScreen? – blakeD
«Я пробовал ... Я тогда связался ... Это потому, что ...?». Извините - это слишком сложно для подражания. Попробуйте найти трассировку отладки, попробуйте включить в свой вопрос больше кода, поставив точки останова и посмотрев, какие переменные, попробуйте опубликовать полное репо. Извините - я нахожу детали в комментариях, которые очень трудно читать - им просто гораздо труднее читать и понимать, чем полные вопросы/ответы здесь. – Stuart
Стюарт - Еще раз ценю обратную связь! Прошу прощения за путаницу, которую я создал, добавив слишком много деталей в комментарии. Я создал простой проект, который отражает то, что я пытаюсь выполнить, но все равно получаю те же результаты. Я подталкиваю проект к GitHub. Я могу найти следующий [link] (https: // github.ком/davidsonblake/SimpleExternalScreen) – blakeD