xaml - XAML 中的中心弹出窗口

标签 xaml windows-8 microsoft-metro windows-runtime winrt-xaml

我使用以下代码创建了一个弹出窗口,但我不知道如何将它居中
我试图在运行时自动更改边距,但我不知道该怎么做,但是有人知道如何将弹出窗口居中吗?
它没有标准维度,因为我需要全局化我的程序

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}" Name="MainGrid">
   <Popup x:Uid="LoginPopup" IsOpen="True" Name="LoginPopup">
      <Grid>
         <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto" />
         </Grid.RowDefinitions>
         <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
         </Grid.ColumnDefinitions>
         <TextBlock Margin="10" Grid.Column="0" Grid.Row="0" Text="App Name" Grid.ColumnSpan="2" Style="{StaticResource HeaderTextStyle}" />
         <TextBlock Margin="10" Grid.Column="0" Grid.Row="1" Text="Username" Style="{StaticResource ResourceKey=SubheaderTextStyle}" />
         <TextBox Margin="10" Grid.Column="1" Grid.Row="1" Name="InputUsername" />
         <TextBlock Margin="10" Grid.Column="0" Grid.Row="2" Text="Password" Style="{StaticResource ResourceKey=SubheaderTextStyle}" />
         <PasswordBox Margin="10" Grid.Column="1" Grid.Row="2" Name="InputPassword" />
         <StackPanel  Margin="10" Grid.Column="1" Grid.Row="3" HorizontalAlignment="Left" Orientation="Horizontal">
            <Button Name="Login"  x:Uid="LoginPopupLogin"  />
            <Button Name="Cancel" x:Uid="LoginPopupCancel" />
         </StackPanel>
      </Grid>
   </Popup>
</Grid>

更新

我尝试在下面使用 user1603313 的答案,但它没有成功,因为它说弹出窗口内的网格大小为 NaN。
我也尝试将方法移到网格中,但它也没有成功
我正在谈论的方法是正确更新网格

private void LoginPopup_Loaded_1(object sender, RoutedEventArgs e)
{
   LoginPopup.HorizontalOffset = (Window.Current.Bounds.Width - gdChild.ActualWidth) / 2;
   LoginPopup.VerticalOffset = (Window.Current.Bounds.Height - gdChild.ActualHeight) / 2;
}

最佳答案

这是您问题的解决方案。我正在重写 xaml 代码并进行修改,您可以在代码后找到解释。

     <Popup x:Uid="LoginPopup" IsOpen="True" Name="LoginPopup" Loaded="LoginPopup_Loaded_1">
        <Grid Background="Red" x:Name="gdChild" Height="Auto" Width="Auto">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <TextBlock Margin="10" Grid.Column="0" Grid.Row="0" Text="App Name" Grid.ColumnSpan="2" Style="{StaticResource HeaderTextStyle}" />
            <TextBlock Margin="10" Grid.Column="0" Grid.Row="1" Text="Username" Style="{StaticResource ResourceKey=SubheaderTextStyle}" />
            <TextBox Margin="10" Grid.Column="1" Grid.Row="1" Name="InputUsername" />
            <TextBlock Margin="10" Grid.Column="0" Grid.Row="2" Text="Password" Style="{StaticResource ResourceKey=SubheaderTextStyle}" />
            <PasswordBox Margin="10" Grid.Column="1" Grid.Row="2" Name="InputPassword" />
            <StackPanel  Margin="10" Grid.Column="1" Grid.Row="3" HorizontalAlignment="Left" Orientation="Horizontal">
                <Button Name="Login"  x:Uid="LoginPopupLogin"  />
                <Button Name="Cancel" x:Uid="LoginPopupCancel" />
            </StackPanel>
        </Grid>
    </Popup>

这里我添加了一个事件 Loaded="LoginPopup_Loaded_1"到弹出窗口的 xaml

这是 C# 中的事件代码
    private void LoginPopup_Loaded_1(object sender, RoutedEventArgs e)
    {
        LoginPopup.HorizontalOffset = (Window.Current.Bounds.Width - gdChild.ActualWidth) / 2;
        LoginPopup.VerticalOffset = (Window.Current.Bounds.Height - gdChild.ActualHeight) / 2;
    }

解释 :

Horizo​​ntalOffset 获取应用程序窗口左侧和弹出窗口左侧之间的距离。

同样垂直偏移获取窗口顶部和弹出窗口顶部之间的距离

因为我们必须将它居中对齐,所以我们必须从应用程序窗口的宽度和高度中减去弹出窗口的宽度和高度的一半(弹出窗口的中心是弹出窗口与其顶部和左侧边界的距离的一半)

代码写在 Loaded="LoginPopup_Loaded_1"事件,因为在应用程序窗口中呈现元素时会调用此事件,并且 Grid 被采用,因为它是所有子元素的容器 Grid。

我希望我清楚:)

关于xaml - XAML 中的中心弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13906170/

相关文章:

C# WPF - 如何将 TextBox Enter 键按下绑定(bind)到方法?

c# - 是否可以有条件地使用 Windows 8 模拟器?

c# - WinRT - 在控件中显示动画 GIF

c# - 绑定(bind)到 UserControl "Failed to assign to property"错误 (Windows 8)

.net - Windows 8 和 MySQL?我有哪些选择?

c# - 在 UI 线程上执行长任务

c# - 如何正确公开自定义控件上的属性?

c# - 如何在我的代码中向日和月添加零?

c# - 在 Metro 应用程序中显示动画 GIF

css - 如何更改 Metro UI 中输入控件的大小?