0

如果检测到一个,我正在尝试在 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。

  1. 使用 MvxMessenger。- 我尝试将消息传递给新的 ViewModel 和 View 本身。只有在我从发布视图模型创建新实例后,新视图模型才会收到消息。但是,我永远无法直接从视图中截取消息...
  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;
    }
}

我确实意识到我已经在这里包含了这两种解决方案。我确实独立地尝试了它们中的每一个。

4

1 回答 1

0

从您发布的代码中,我看不到您实际为视图设置数据上下文的任何地方。

在“正常 mvvmcross”中:

  • MvxViewController 在 vi​​ewDidLoad 中使用其显示请求创建自己的 DataContext (ViewModel)
  • 其他一些应用程序代码根据应用程序特定的逻辑设置 MvxView 的 DataContext - 请参阅http://mvvmcross.wordpress.com中的 n=32作为示例

在您的代码中,我目前看不到您在哪里设置 - 所以请尝试在某处设置 view.DataContext。

于 2013-07-02T06:37:10.703 回答