如果检测到一个,我正在尝试在 iOS 的外部监视器上显示一个 UIView。我能够使用以下代码检测并显示一个简单的 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 本身。只有在我从发布视图模型创建新实例后,新视图模型才会收到消息。但是,我永远无法直接从视图中截取消息...
- 延迟绑定和常规流式绑定,其中绑定的视图模型属性只是从另一个视图模型更新。
- 尝试将此视图与已与另一个视图关联的视图模型绑定。
- 一方面许愿,另一方面拉屎......猜猜哪个先填满;)
就好像 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;
}
}
我确实意识到我已经在这里包含了这两种解决方案。我确实独立地尝试了它们中的每一个。