使内容对话框像Groove应用程序中的那样移动

时间:2016-03-10 22:57:49

标签: c# xaml win-universal-app windows-10-universal

我创建了一个ContentDialog来应用一个Style(我不能用一个Message Dialog和一个PopUp来应用),但是我遇到了问题,它不可移动或者我可以&#39 ; t关闭它就像我点击Groove App中的按钮" Connexion"时出现的框架一样 enter image description here

请您知道,我可以在the ContentDialog style修改哪一部分以使此ContentDialog可移动并将其关闭,就像顶部的图像一样

我在通用应用上工作

3 个答案:

答案 0 :(得分:6)

  

请您知道,我可以在ContentDialog样式中修改哪一部分来移动此ContentDialog并将其关闭,就像顶部的图像一样。

我担心ContentDialog不可移动,你在Groove应用程序或系统的邮件应用程序中显示的图像不是ContentDialog,实际上,这个“对话框”由{ {3}}。如果我们使用ProcessMonitor跟踪此UI,我们会发现这是一个系统应用程序C:\ Windows \ SystemApps \ Microsoft.AccountsControl_cw5n1h2txyewy。您可以在SO上看到类似问题中的图片和信息:UserDataAccountManager.ShowAddAccountAsync

对于您的问题,我们无法启动Microsoft.AccountsControl等系统应用程序获取结果,我们只能使用API​​ UserDataAccountManager.ShowAddAccountAsync来调用它。但您可以创建一个UWP应用,并针对其他应用的结果启动此应用,为此,请参阅UWP Modal Window

或者,如果您只想要一个可移动的UI,您可以在应用中创建一个新窗口,并更改此新窗口的大小,使其像ContentDialog一样弹出行为,但是这个新窗口将显示您的应用程序的标题,无法删除。

如何创建新窗口?例如:

    private async void OnClick(object sender, RoutedEventArgs e)
    {
        var newCoreAppView = CoreApplication.CreateNewView();
        var appView = ApplicationView.GetForCurrentView();
        await newCoreAppView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low, async () =>
        {
            var window = Window.Current;
            var newAppView = ApplicationView.GetForCurrentView();

            var frame = new Frame();
            window.Content = frame;

            frame.Navigate(typeof(BlankPage));            
            window.Activate();
            await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newAppView.Id, ViewSizePreference.Default, appView.Id, ViewSizePreference.Default);

        });
    }

如何更改新窗口的大小?例如,在新窗口中显示的页面的cs文件中:

public BlankPage()
        {
            this.InitializeComponent();
            this.Loaded += Page_Loaded;
        }

        private void Page_Loaded(object sender, RoutedEventArgs e)
        {
            var s = ApplicationView.GetForCurrentView();
            s.TryResizeView(new Size { Width = 600, Height = 320 });
        }

这将形成600宽度和320高度的窗口。

答案 1 :(得分:1)

我认为你可以用另一种方式做到:

  1. 创建UserControl,像弹出窗口一样定义UI。
  2. 将ManipulationMode设置为翻译。
  3. 处理ManipulationDelta事件以移动
  4. UserControll(让我们将CompositeTransform作为RenderTransform放置)。
  5. 根据需要实施动画使用页面中的UserControll

答案 2 :(得分:0)

这是我的做法,因为从现在到4年前我都没有找到答案:)

                            var dialog = new ContentDialog()
                            {
                                Title = "This is a Title!",
                                ManipulationMode = ManipulationModes.All,
                            };
                            dialog.ManipulationDelta += delegate (object sender, ManipulationDeltaRoutedEventArgs e)
                            {
                                if(!e.IsInertial)
                                    dialog.Margin = new Thickness(
                                        dialog.Margin.Left + e.Delta.Translation.X,
                                        dialog.Margin.Top + e.Delta.Translation.Y,
                                        dialog.Margin.Left - e.Delta.Translation.X,
                                        dialog.Margin.Top - e.Delta.Translation.Y
                                        );
                            };