ContentDialog未与UWP中心对齐

时间:2016-04-03 10:05:11

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

据我所知,ContentDialog的默认行为应该是让它以PC为中心并在移动设备上与顶部对齐,但在我的情况下,即使在PC上也让它与顶部对齐,我不会了解发生了什么。

我正在使用代码隐藏创建它,这是我正在使用的代码片段:

// Creates the password box
var passwordBox = new PasswordBox {IsPasswordRevealButtonEnabled = true, Margin = new Thickness(5)};            

// Creates the StackPanel with the content
var contentPanel = new StackPanel();
contentPanel.Children.Add(new TextBlock
{
    Text = "Insert your password to access the application",
    Margin = new Thickness(5),
    TextWrapping = TextWrapping.WrapWholeWords
});
contentPanel.Children.Add(passwordBox);       

// Creates the password dialog
_passwordDialog = new ContentDialog
{
    PrimaryButtonText = "accept",
    IsPrimaryButtonEnabled = false,
    SecondaryButtonText = "exit",
    Title = "Authentication",
    Content = contentPanel
};

// Report that the dialog has been opened to avoid overlapping
_passwordDialog.Opened += (s, e) =>
{
    // HACK - opacity set to 0 to avoid seeing behind dialog
    Window.Current.Content.Opacity = 0;
    _canShowPasswordDialog = false;
};
// Report that the dialog has been closed to enable it again
_passwordDialog.Closed += (s, e) =>
{
    // HACK - opacity set to 1 to reset the window to original options
    Window.Current.Content.Opacity = 1;
    _canShowPasswordDialog = true;
};

// Clear inserted password for next logins
_passwordDialog.PrimaryButtonClick += (s, e) =>
{
    // ... login ...
};

// Close the app if the user doesn't insert the password
_passwordDialog.SecondaryButtonClick += (s, e) => { BootStrapper.Current.Exit(); };

// Set the binding to enable/disable the accept button 

_passwordDialog.SetBinding(ContentDialog.IsPrimaryButtonEnabledProperty, new Binding
{
    Source = passwordBox,
    Path = new PropertyPath("Password"),
    Mode = BindingMode.OneWay,
    Converter = new PasswordValidatorConverter()
});

我已尝试使用VerticalAlignmentFullSizeDesired,但我没有得到预期的结果。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

<table class="easyui-datagrid" id="dg" title="Raport Nilai " style="width:auto;height:250px" toolbar="#toolbar" data-options="rownumbers:true,singleSelect:true"> <thead> <tr> <th data-options="field:'',width:100" rowspan="2">NRIC</th> <th data-options="field:'',width:150" rowspan="2">Nama Siswa</th> <th colspan="<?php echo count($hasil); ?>" width="200" >Nilai UTS</th> <th data-options="field:'ss',width:100" align="center" rowspan="2">JML</th> <th data-options="field:'ss',width:100" align="center" rowspan="2">RT</th> </tr> <tr> <?php foreach ($hasil as $item):?> <th data-options="field:'listprice',width:80,align:'center'"> <?php echo $item->kodemapel?> </th> <?php endforeach; ?> </tr> <tr> <th field="NRIC" width="100" align="center"></th> <th field="NAME" width="150" align="center"></th> <?php foreach ($hasil as $item):?> <th id="nilai" field="<?php echo "$item->kodemapel"; ?>" align="center"></th> <?php endforeach; ?> <th field="JML" width="50" align="center" data-options =" "></th> <th field="RT" width="50" align="center" data-options ="formatter:function(value,row,index){return ratarata(row);}"></th> </tr> </thead> </table> ContentDialog控件类似,Popup在页面上显示时保持它。但与PopupRoot控件不同,放置Popup的位置会写在后面的代码中,并且此属性不会向我们公开,我们无法更改它。

  

据我所知,ContentDialog的默认行为应该是让它以PC为中心。

ContentDialog并非始终以PC为中心。我根据您发布的代码测试ContentDialog个基础。当页面高度小于640时,ContentDialog与页面顶部对齐。当页面高度等于640或大于640时,它位于页面的中心。

enter image description here

从上图中我们可以看到ContentDialog的位置由ContentDialog的高度触发。

答案 1 :(得分:0)

以下是:

  1. 使用placement参数显示对话框,如下所示:dialog.ShowAsync(ContentDialogPlacement.InPlace)。
  2. 将您的内容对话框实例化为应用程序布局的一部分,例如在App类中添加类似内容:

    private Grid RootGrid => (Grid)Window.Current.Content;
    private Frame Frame => this.RootGrid?.Children[0] as Frame;
    private ContentDialog ContentDialog => this.RootGrid?.Children[1] as ContentDialog;
    
    protected override void OnLaunched(LaunchActivatedEventArgs e)
    {
        if (Window.Current.Content == null) {
            Window.Current.Content = new Grid();
            Debug.Assert( this.RootGrid != null);
            this.RootGrid.Children.Add(new Frame()); 
            this.RootGrid.Children.Add(new ContentDialog());
            Debug.Assert(this.Frame != null && this.ContentDialog != null);
        }
        ...
        Window.Current.Activate();
    }
    
  3. 将内容对话框的Horizo​​ntalAlignment,VerticalAlignment,MaxWidth和MaxHeight保留为默认值,以使对话框的“模态背景”覆盖应用的整个区域。

  4. P.S。有关确保一次只显示一个内容对话框的提示,请参阅"Only a single ContentDialog can be open at any time." error while opening another contentdialog

答案 2 :(得分:0)

我不知道这里的来龙去脉,但这似乎是设置对话框的MaxWidth或MaxHeight引起问题的原因。

我将Maxwidth设置为500,并且对话框最终显示在屏幕左侧。我将MaxWidth更改为600,对话框仍然位于左侧,但距离目前还不太远。

然后我删除了MaxWidth,对话框又回到了屏幕中央。

大概是通过某种叠加层创建对话框,该叠加层需要为全屏尺寸才能正确对齐对话框。设置MaxWidth或MaxHeight时,它设置 overlay 的宽度/高度,而不是对话框本身。因此,如果这些值小于您的实际屏幕尺寸,则覆盖图位于屏幕的一侧(朝着上,左手边),而对话框位于覆盖图的中间。

删除MaxWidth为我解决了这个问题。

要获得所需的宽度,不要在对话框本身上设置MaxWidth,而应在告诉对话框保留的内容上设置MaxWidth。

刚刚仔细地看了其他答案,我注意到sjb-sjb也暗示了这一点。我不明白他的答案中所有其他代码是做什么的。只需删除MaxWidth / Height即可解决此问题。