예제 #1
0
 public void ShowTool(
     Func <ILifetimeScope, IToolView> toolFactory,
     ViewRequest viewRequest = null,
     UiShowOptions options   = null)
 {
     ShowToolIn(DefaultDockingManager.Tools, toolFactory, viewRequest, options);
 }
예제 #2
0
        public void ShowTool <TToolView>(
            ViewRequest viewRequest = null,
            UiShowOptions options   = null)
            where TToolView : class, IToolView
        {
            var view = Container.Resolve <TToolView>();

            if (options != null)
            {
                view.Configure(options);
            }

            (view.ViewModel as IInitializableViewModel)?.Initialize(viewRequest);

            var layoutAnchorable = new LayoutAnchorable
            {
                CanClose    = false,
                CanAutoHide = false,
                CanHide     = false,
                CanFloat    = false,
            };

            layoutAnchorable.Content = view;
            ToolsPane.Children.Add(layoutAnchorable);
        }
예제 #3
0
        public void ShowView <TView>(
            ViewRequest viewRequest = null,
            UiShowOptions options   = null)
            where TView : class, IView
        {
            var view = Container.Resolve <TView>();

            if (options != null)
            {
                view.Configure(options);
            }

            var layoutDocument = new LayoutDocument {
                Content = view
            };

            if (options != null)
            {
                layoutDocument.CanClose = options.CanClose;
            }

            AddTitleRefreshing(view, layoutDocument);
            AddClosingByRequest(view, layoutDocument);

            DocumentPane.Children.Add(layoutDocument);

            // TODO: provide parameters to ViewModel ???
            (view.ViewModel as IInitializableViewModel)?.Initialize(viewRequest);

            layoutDocument.IsActive = true;
        }
예제 #4
0
 public void ShowView(
     Func <ILifetimeScope, IView> viewFactory,
     ViewRequest viewRequest = null,
     UiShowOptions options   = null)
 {
     ShowViewIn(DefaultDockingManager.Views, viewFactory, viewRequest, options);
 }
예제 #5
0
 public async void ShowFlyoutView <TView>(
     ViewRequest viewRequest     = null,
     UiShowFlyoutOptions options = null)
     where TView : class, IView
 {
     await ShowFlyoutView <TView, Unit>();
 }
예제 #6
0
 public void ShowChildWindowView <TView>(
     ViewRequest viewRequest          = null,
     UiShowChildWindowOptions options = null)
     where TView : class, IView
 {
     ShowChildWindowView <TView, Unit>();
 }
예제 #7
0
 private static void ActivateContent(LayoutContent layoutContent, ViewRequest viewRequest)
 {
     layoutContent.IsActive = true;
     if (layoutContent.Content is IView view &&
         view.ViewModel is Ui.Wpf.Common.ViewModels.IActivatableViewModel activatableViewModel)
     {
         activatableViewModel.Activate(viewRequest);
     }
 }
예제 #8
0
 public Task <TResult> ShowChildWindowView <TView, TResult>(
     ViewRequest viewRequest          = null,
     UiShowChildWindowOptions options = null)
     where TView : class, IView
 {
     return(ShowChildWindowView <TResult>(
                container => container.Resolve <TView>(),
                viewRequest,
                options));
 }
예제 #9
0
 public void ShowView <TView>(
     ViewRequest viewRequest = null,
     UiShowOptions options   = null)
     where TView : class, IView
 {
     ShowViewIn(DefaultDockingManager.Views,
                container => container.Resolve <TView>(),
                viewRequest,
                options);
 }
예제 #10
0
 public void ShowTool <TToolView>(
     ViewRequest viewRequest = null,
     UiShowOptions options   = null)
     where TToolView : class, IToolView
 {
     ShowToolIn(DefaultDockingManager.Tools,
                container => container.Resolve <TToolView>(),
                viewRequest,
                options);
 }
예제 #11
0
 public void ShowToolIn <TToolView>(
     string containerName,
     ViewRequest viewRequest = null,
     UiShowOptions options   = null)
     where TToolView : class, IToolView
 {
     ShowToolIn(containerName,
                container => container.Resolve <TToolView>(),
                viewRequest,
                options);
 }
예제 #12
0
        private static void InitializeView(IView view, ViewRequest viewRequest)
        {
            if (view.ViewModel is ViewModelBase vmb)
            {
                vmb.ViewId = viewRequest?.ViewId;
            }

            if (view.ViewModel is IInitializableViewModel initializibleViewModel)
            {
                initializibleViewModel.Initialize(viewRequest);
            }
        }
예제 #13
0
        public void ShowView <TView>(
            ViewRequest viewRequest = null,
            UiShowOptions options   = null)
            where TView : class, IView
        {
            var layoutContent = null;

            if (viewRequest?.ViewId != null)
            {
                layoutContent = DocumentPane.Children.FirstOrDefault(x => x.ContentId == viewRequest?.ViewId);
            }

            if (layoutContent != null)
            {
                layoutContent.IsActive = true;
            }
            else
            {
                var view = Container.Resolve <TView>();
                if (options != null)
                {
                    view.Configure(options);
                }

                var layoutDocument = new LayoutDocument {
                    Content = view
                };
                layoutDocument.ContentId = viewRequest?.ViewId;
                if (options != null)
                {
                    layoutDocument.CanClose = options.CanClose;
                }

                AddTitleRefreshing(view, layoutDocument);
                AddClosingByRequest(view, layoutDocument);

                DocumentPane.Children.Add(layoutDocument);

                (view.ViewModel as ViewModelBase)?.ViewId = viewRequest?.ViewId;
                (view.ViewModel as IInitializableViewModel)?.Initialize(viewRequest);

                layoutDocument.IsActive = true;
            }
        }
예제 #14
0
        public void ShowViewIn(
            string containerName,
            Func <ILifetimeScope, IView> viewFactory,
            ViewRequest viewRequest = null,
            UiShowOptions options   = null)
        {
            var documentPane   = DockingManager.FindObjectByName <LayoutGroup <LayoutContent> >(containerName);
            var layoutDocument = documentPane.FindByViewRequest <LayoutContent>(viewRequest);

            if (layoutDocument == null)
            {
                var view = viewFactory(Container);
                if (options != null)
                {
                    view.Configure(options);
                }

                layoutDocument = new LayoutDocument
                {
                    ContentId = viewRequest?.ViewId,
                    Content   = view
                };
                if (options != null)
                {
                    layoutDocument.CanClose = options.CanClose;
                }

                AddTitleRefreshing(view, layoutDocument);
                AddWindowBehaviour(view, layoutDocument);
                AddClosingByRequest(view, layoutDocument);

                documentPane.Children.Add(layoutDocument);

                InitializeView(view, viewRequest);
            }

            ActivateContent(layoutDocument, viewRequest);
        }
예제 #15
0
        public void ShowToolIn(
            string containerName,
            Func <ILifetimeScope, IToolView> toolFactory,
            ViewRequest viewRequest = null,
            UiShowOptions options   = null)
        {
            var toolsPane        = DockingManager.FindObjectByName <LayoutGroup <LayoutAnchorable> >(containerName);
            var layoutAnchorable = toolsPane.FindByViewRequest <LayoutAnchorable>(viewRequest);

            if (layoutAnchorable == null)
            {
                var view = toolFactory(Container);
                if (options != null)
                {
                    view.Configure(options);
                }

                layoutAnchorable = new LayoutAnchorable
                {
                    ContentId   = viewRequest?.ViewId,
                    Content     = view,
                    CanAutoHide = false,
                    CanFloat    = false,
                };
                view.ViewModel.CanClose = false;
                view.ViewModel.CanHide  = false;

                AddTitleRefreshing(view, layoutAnchorable);
                AddWindowBehaviour(view, layoutAnchorable);
                AddClosingByRequest(view, layoutAnchorable);

                toolsPane.Children.Add(layoutAnchorable);

                InitializeView(view, viewRequest);
            }

            ActivateContent(layoutAnchorable, viewRequest);
        }
예제 #16
0
 public async void ShowChildWindowView(Func <ILifetimeScope, IView> viewFactory, ViewRequest viewRequest = null,
                                       UiShowChildWindowOptions options = null)
 {
     await ShowChildWindowView <Unit>(viewFactory, viewRequest, options);
 }
예제 #17
0
        public Task <TResult> ShowChildWindowView <TResult>(Func <ILifetimeScope, IView> viewFactory,
                                                            ViewRequest viewRequest          = null,
                                                            UiShowChildWindowOptions options = null)
        {
            if (!string.IsNullOrEmpty(viewRequest?.ViewId))
            {
                var metroDialogContainer = Window.Template.FindName("PART_MetroActiveDialogContainer", Window) as Grid;
                metroDialogContainer = metroDialogContainer ??
                                       Window.Template.FindName("PART_MetroInactiveDialogsContainer", Window) as Grid;

                if (metroDialogContainer == null)
                {
                    throw new InvalidOperationException(
                              "The provided child window can not add, there is no container defined.");
                }

                var viewOld = metroDialogContainer.Children
                              .Cast <ChildWindowView>()
                              .Select(x => (IView)x.Content)
                              .FirstOrDefault(x => (x.ViewModel as ViewModelBase)?.ViewId == viewRequest.ViewId);

                if (viewOld != null)
                {
                    (viewOld.ViewModel as Ui.Wpf.Common.ViewModels.IActivatableViewModel)?.Activate(viewRequest);
                    return(Task.FromResult(default(TResult)));
                }
            }

            var view = viewFactory(Container);

            if (options != null)
            {
                view.Configure(options);
            }

            InitializeView(view, viewRequest);
            (view.ViewModel as Ui.Wpf.Common.ViewModels.IActivatableViewModel)?.Activate(viewRequest);

            options = options ?? new UiShowChildWindowOptions();

            var childWindow = new ChildWindowView(options)
            {
                Content = view
            };

            var vm = view.ViewModel as ViewModelBase;

            if (vm != null)
            {
                Observable
                .FromEventPattern <ViewModelCloseQueryArgs>(
                    x => vm.CloseQuery += x,
                    x => vm.CloseQuery -= x)
                .Subscribe(x =>
                {
                    if (vm is IResultableViewModel <TResult> model)
                    {
                        childWindow.Close(model.ViewResult);
                    }
                    else
                    {
                        childWindow.Close();
                    }
                })
                .DisposeWith(vm.Disposables);

                Observable
                .FromEventPattern <CancelEventArgs>(
                    x => childWindow.Closing += x,
                    x => childWindow.Closing -= x)
                .Subscribe(x =>
                {
                    var vcq = new ViewModelCloseQueryArgs {
                        IsCanceled = false
                    };
                    vm.Closing(vcq);

                    if (vcq.IsCanceled)
                    {
                        x.EventArgs.Cancel = true;
                    }
                })
                .DisposeWith(vm.Disposables);
            }

            var disposables = new CompositeDisposable();

            view.ViewModel
            .WhenAnyValue(x => x.Title)
            .Subscribe(x => childWindow.Title = x)
            .DisposeWith(disposables);
            view.ViewModel
            .WhenAnyValue(x => x.CanClose)
            .Subscribe(x => childWindow.ShowCloseButton = x)
            .DisposeWith(disposables);

            Observable
            .FromEventPattern <RoutedEventHandler, RoutedEventArgs>(
                x => childWindow.ClosingFinished += x,
                x => childWindow.ClosingFinished -= x)
            .Select(x => (ChildWindow)x.Sender)
            .Take(1)
            .Subscribe(x =>
            {
                disposables.Dispose();
                vm?.Closed(new ViewModelCloseQueryArgs());
                x.Content = null;
            });

            return(Window.ShowChildWindowAsync <TResult>(
                       childWindow,
                       options.OverlayFillBehavior
                       ));
        }
예제 #18
0
        public async Task <TResult> ShowFlyoutView <TResult>(Func <ILifetimeScope, IView> viewFactory,
                                                             ViewRequest viewRequest = null, UiShowFlyoutOptions options = null)
        {
            if (!string.IsNullOrEmpty(viewRequest?.ViewId))
            {
                var viewOld = FlyoutsControl.Items
                              .Cast <Flyout>()
                              .Select(x => (IView)x.Content)
                              .FirstOrDefault(x => (x.ViewModel as ViewModelBase)?.ViewId == viewRequest.ViewId);

                if (viewOld != null)
                {
                    (viewOld.ViewModel as Ui.Wpf.Common.ViewModels.IActivatableViewModel)?.Activate(viewRequest);
                    return(default(TResult));
                }
            }

            var view = viewFactory(Container);

            if (options != null)
            {
                view.Configure(options);
            }

            options = options ?? new UiShowFlyoutOptions();

            var flyout = new Flyout
            {
                IsModal               = options.IsModal,
                Position              = options.Position,
                Theme                 = options.Theme,
                ExternalCloseButton   = options.ExternalCloseButton,
                IsPinned              = options.IsPinned,
                CloseButtonIsCancel   = options.CloseByEscape,
                CloseCommand          = options.CloseCommand,
                CloseCommandParameter = options.CloseCommandParameter,
                AnimateOpacity        = options.AnimateOpacity,
                AreAnimationsEnabled  = options.AreAnimationsEnabled,
                IsAutoCloseEnabled    = options.IsAutoCloseEnabled,
                AutoCloseInterval     = options.AutoCloseInterval,
                Width                 = options.Width ?? double.NaN,
                Height                = options.Height ?? double.NaN,
                Content               = view,
                IsOpen                = true
            };

            var vm = view.ViewModel as ViewModelBase;

            if (vm != null)
            {
                Observable
                .FromEventPattern <ViewModelCloseQueryArgs>(
                    x => vm.CloseQuery       += x,
                    x => vm.CloseQuery       -= x)
                .Subscribe(x => flyout.IsOpen = false)
                .DisposeWith(vm.Disposables);
            }

            var disposables = new CompositeDisposable();

            view.ViewModel
            .WhenAnyValue(x => x.Title)
            .Subscribe(x =>
            {
                flyout.Header          = x;
                flyout.TitleVisibility =
                    !string.IsNullOrEmpty(x)
                            ? Visibility.Visible
                            : Visibility.Collapsed;
            })
            .DisposeWith(disposables);
            view.ViewModel
            .WhenAnyValue(x => x.CanClose)
            .Subscribe(x => flyout.CloseButtonVisibility = x ? Visibility.Visible : Visibility.Collapsed)
            .DisposeWith(disposables);

            var closedObservable = Observable
                                   .FromEventPattern <RoutedEventHandler, RoutedEventArgs>(
                x => flyout.ClosingFinished += x,
                x => flyout.ClosingFinished -= x);

            FlyoutsControl.Items.Add(flyout);
            InitializeView(view, viewRequest);
            (view.ViewModel as Ui.Wpf.Common.ViewModels.IActivatableViewModel)?.Activate(viewRequest);

            await closedObservable.FirstAsync();

            disposables.Dispose();
            vm?.Closed(new ViewModelCloseQueryArgs());
            flyout.Content = null;
            FlyoutsControl.Items.Remove(flyout);

            if (vm is IResultableViewModel <TResult> model)
            {
                return(model.ViewResult);
            }

            return(default(TResult));
        }