public ImageScrollViewerViewModel(IContainerExtension container, IRegionManager regionManager, MyImage myImage) { ImageSource = myImage.ObserveProperty(x => x.ImageSource).ToReadOnlyReactiveProperty(mode: ReactivePropertyMode.None); // ズーム倍率のデバッグ表示 ImageZoomPayload .Subscribe(x => Console.WriteLine($"VM-ZoomMagRatio: {x.IsEntire} => {(x.MagRatio * 100.0):f2} %")); // スクロール位置のデバッグ表示 ImageScrollOffsetCenter .Subscribe(x => Console.WriteLine($"VM-ScrollOffsetRatio: {x.Width:f2} x {x.Height:f2}")); ZoomAllCommand .Subscribe(x => { // 全画面の再要求を行うと、Viewで設定した倍率をクリアしてしまうので行わない if (!ImageZoomPayload.Value.IsEntire) { ImageZoomPayload.Value = new ImageZoomPayload(true, double.NaN); } }); ZoomX1Command .Subscribe(x => ImageZoomPayload.Value = new ImageZoomPayload(false, 1.0)); OffsetCenterCommand .Subscribe(x => ImageScrollOffsetCenter.Value = new Size(0.5, 0.5)); }
public ScrollImageViewerViewModel(IContainerExtension container, ImageViewParameter parameter) { var compositeDirectory = container.Resolve <ICompositeImageDirectory>(); var imageDirectory = compositeDirectory.ImageDirectries[parameter.ContentIndex]; #region ImageSource ImageSource = imageDirectory .ObserveProperty(x => x.SelectedImage) .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); IsLoadingImage = ImageSource .Select(x => x != null) .ToReadOnlyReactiveProperty(mode: ReactivePropertyMode.DistinctUntilChanged) .AddTo(CompositeDisposable); #endregion #region Zoom imageDirectory .ObserveProperty(x => x.ZoomMagRatio) .Subscribe(x => ImageZoomMagPayload.Value = double.IsNaN(x) ? ImageZoomMag.Entire : new ImageZoomMag(false, x)) .AddTo(CompositeDisposable); ImageZoomMagPayload .Select(x => x.IsEntire ? double.NaN : x.MagRatio) .Subscribe(mag => compositeDirectory.SetImageZoomMagRatioToAll(parameter.ContentIndex, mag)) .AddTo(CompositeDisposable); IsImageZoomingIn //.Do(b => Debug.WriteLine($"IsImageZoomingIn({parameter.ContentIndex}): {b}")) .Subscribe(b => imageDirectory.IsZoomingIn = b) .AddTo(CompositeDisposable); #endregion #region Offset imageDirectory .ObserveProperty(x => x.OffsetCenterRatio) //.Do(x => Debug.WriteLine($"{indexMessage}-FromM ({x.X:f4}, {x.Y:f4})")) .Subscribe(p => ImageScrollOffsetCenterRatio.Value = p) .AddTo(CompositeDisposable); ImageScrollOffsetCenterRatio //.Do(x => Debug.WriteLine($"{indexMessage}-ToM: ({x.X:f4}, {x.Y:f4})")) .Subscribe(p => imageDirectory.OffsetCenterRatio = p) .AddTo(CompositeDisposable); #endregion // 自分以外の画像ディレクトリに変更を通知する(自身は適用済み) ImageScrollVectorRatio .Subscribe(v => compositeDirectory.SetImageShiftRatioToOthers(parameter.ContentIndex, v)) .AddTo(CompositeDisposable); ImageViewport .Subscribe(v => compositeDirectory.SetImageViewportToAll(parameter.ContentIndex, v)) .AddTo(CompositeDisposable); var viewSettings = container.Resolve <ViewSettings>(); IsImageViewerInterlock = viewSettings .ObserveProperty(x => x.IsImageViewerInterlock) .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); CanVisibleReducedImage = viewSettings .ObserveProperty(x => x.CanVisibleReducedImage) .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); IsVisibleSamplingFrameOnImage = new[] { IsLoadingImage, viewSettings.ObserveProperty(x => x.IsVisibleImageOverlapSamplingFrame), viewSettings.ObserveProperty(x => x.IsVisibleSamplingFrameOnImage) } .CombineLatestValuesAreAllTrue() .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); IsVisibleSamplingFrameOnScroll = new[] { IsLoadingImage, viewSettings.ObserveProperty(x => x.IsVisibleImageOverlapSamplingFrame), viewSettings.ObserveProperty(x => x.IsVisibleSamplingFrameOnImage).Inverse() } .CombineLatestValuesAreAllTrue() .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); #region forDebug // View通知情報のデバッグ表示 var indexMessage = $"VM({parameter.ContentIndex}/{parameter.ContentCount})"; ImageZoomMagPayload .Subscribe(x => Debug.WriteLine($"{indexMessage}-ImageZoomPayload: {x.IsEntire} => {(x.MagRatio * 100.0):f4} %")) .AddTo(CompositeDisposable); ImageScrollOffsetCenterRatio .Subscribe(x => Debug.WriteLine($"{indexMessage}-ImageScrollOffsetCenterRatio: ({x.X:f4}, {x.Y:f4})")) .AddTo(CompositeDisposable); SamplingFrameRect .Subscribe(x => Debug.WriteLine($"{indexMessage}-SamplingFrameRect: ({x.X:f2}, {x.Y:f2}) {x.Width:f2} x {x.Height:f2}")) .AddTo(CompositeDisposable); ZoomAllCommand .Subscribe(x => { // 全画面の再要求を行うと、Viewで設定した倍率をクリアしてしまうので行わない if (!ImageZoomMagPayload.Value.IsEntire) { ImageZoomMagPayload.Value = new ImageZoomMag(true, double.NaN); } }) .AddTo(CompositeDisposable); ZoomX1Command .Subscribe(x => ImageZoomMagPayload.Value = new ImageZoomMag(false, 1.0)) .AddTo(CompositeDisposable); OffsetCenterCommand .Subscribe(x => ImageScrollOffsetCenterRatio.Value = new Point(0.5, 0.5)) .AddTo(CompositeDisposable); //PointTest.Subscribe(x => Debug.WriteLine($"VM-PointTest: {x}")).AddTo(CompositeDisposable); #endregion }
public ImageScrollControlViewModel(IContainerExtension container, IRegionManager regionManager) { var mainImages = container.Resolve <MainImages>(); var viewSettings = container.Resolve <ViewSettings>(); IsImageViewerInterlock = viewSettings.ObserveProperty(x => x.IsImageViewerInterlock).ToReadOnlyReactiveProperty(); CanVisibleReducedImage = viewSettings.ObserveProperty(x => x.CanVisibleReducedImage).ToReadOnlyReactiveProperty(); IsSamplingFrameOnImage = new[] { viewSettings.ObserveProperty(x => x.IsVisibleImageOverlapSamplingFrame), viewSettings.ObserveProperty(x => x.IsSamplingFrameOnImage) } .CombineLatestValuesAreAllTrue() .ToReadOnlyReactiveProperty(); IsSamplingFrameOnScrollContent = new[] { viewSettings.ObserveProperty(x => x.IsVisibleImageOverlapSamplingFrame), viewSettings.ObserveProperty(x => x.IsSamplingFrameOnImage).Inverse() } .CombineLatestValuesAreAllTrue() .ToReadOnlyReactiveProperty(); // 画像管理クラスのインデックスを取得 int index = mainImages.GetImageIndex(); LoadImageCommand.Subscribe(x => mainImages.LoadImage(index)); ImageSource = mainImages.ImageSources[index].ObserveProperty(x => x.ImageSource) .ToReadOnlyReactiveProperty(mode: ReactivePropertyMode.None); // View通知情報のデバッグ表示 ImageZoomPayload .Subscribe(x => Console.WriteLine($"VM({index})-ZoomMagRatio: {x.IsEntire} => {(x.MagRatio * 100.0):f2} %")); ImageScrollOffsetCenterRatio .Subscribe(x => Console.WriteLine($"VM({index})-ScrollOffsetRatio: ({x.X:f2}, {x.Y:f2})")); SamplingFrameRect .Subscribe(x => Console.WriteLine($"VM({index})-SamplingFrameRect: ({x.X:f2}, {x.Y:f2}) {x.Width:f2} x {x.Height:f2}")); ZoomAllCommand .Subscribe(x => { // 全画面の再要求を行うと、Viewで設定した倍率をクリアしてしまうので行わない if (!ImageZoomPayload.Value.IsEntire) { ImageZoomPayload.Value = new ImageZoomPayload(true, double.NaN); } }); ZoomX1Command .Subscribe(x => ImageZoomPayload.Value = new ImageZoomPayload(false, 1.0)); OffsetCenterCommand .Subscribe(x => ImageScrollOffsetCenterRatio.Value = new Point(0.5, 0.5)); //PointTest.Subscribe(x => Console.WriteLine($"VM-PointTest: {x}")); }
public ZoomableImageViewModel(IContainerExtension container, ImageViewParameter parameter) { var compositeDirectory = container.Resolve <ICompositeImageDirectory>(); var imageDirectory = compositeDirectory.ImageDirectries[parameter.ContentIndex]; ImageSource = imageDirectory.ObserveProperty(x => x.SelectedImage) .ToReadOnlyReactiveProperty(mode: ReactivePropertyMode.None) .AddTo(CompositeDisposable); IsLoadingImage = ImageSource.Select(x => x != null) .ToReadOnlyReactiveProperty(mode: ReactivePropertyMode.DistinctUntilChanged) .AddTo(CompositeDisposable); var viewSettings = container.Resolve <ViewSettings>(); IsImageViewerInterlock = viewSettings.ObserveProperty(x => x.IsImageViewerInterlock) .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); CanVisibleReducedImage = viewSettings.ObserveProperty(x => x.CanVisibleReducedImage) .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); IsVisibleSamplingFrameOnImage = new[] { IsLoadingImage, viewSettings.ObserveProperty(x => x.IsVisibleImageOverlapSamplingFrame), viewSettings.ObserveProperty(x => x.IsVisibleSamplingFrameOnImage) } .CombineLatestValuesAreAllTrue() .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); IsVisibleSamplingFrameOnScroll = new[] { IsLoadingImage, viewSettings.ObserveProperty(x => x.IsVisibleImageOverlapSamplingFrame), viewSettings.ObserveProperty(x => x.IsVisibleSamplingFrameOnImage).Inverse() } .CombineLatestValuesAreAllTrue() .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); // View通知情報のデバッグ表示 var indexMessage = $"VM({parameter.ContentIndex}/{parameter.ContentCount})"; ImageZoomPayload .Subscribe(x => Debug.WriteLine($"{indexMessage}-ImageZoomPayload: {x.IsEntire} => {(x.MagRatio * 100.0):f2} %")) .AddTo(CompositeDisposable); ImageScrollOffsetCenterRatio .Subscribe(x => Debug.WriteLine($"{indexMessage}-ImageScrollOffsetCenterRatio: ({x.X:f2}, {x.Y:f2})")) .AddTo(CompositeDisposable); SamplingFrameRect .Subscribe(x => Debug.WriteLine($"{indexMessage}-SamplingFrameRect: ({x.X:f2}, {x.Y:f2}) {x.Width:f2} x {x.Height:f2}")) .AddTo(CompositeDisposable); ZoomAllCommand .Subscribe(x => { // 全画面の再要求を行うと、Viewで設定した倍率をクリアしてしまうので行わない if (!ImageZoomPayload.Value.IsEntire) { ImageZoomPayload.Value = new ImageZoomPayload(true, double.NaN); } }) .AddTo(CompositeDisposable); ZoomX1Command .Subscribe(x => ImageZoomPayload.Value = new ImageZoomPayload(false, 1.0)) .AddTo(CompositeDisposable); OffsetCenterCommand .Subscribe(x => ImageScrollOffsetCenterRatio.Value = new Point(0.5, 0.5)) .AddTo(CompositeDisposable); //PointTest.Subscribe(x => Debug.WriteLine($"VM-PointTest: {x}")).AddTo(CompositeDisposable); }