我使用以下代码创建了一个Popup,但我无法弄清楚如何将它居中
我试图在运行时自动更改边距,但我无法弄清楚如何做到这一点,但有人知道如何将弹出窗口居中吗?
它没有标准维度原因我需要全球化我的程序
我试图在运行时自动更改边距,但我无法弄清楚如何做到这一点,但有人知道如何将弹出窗口居中吗?
它没有标准维度原因我需要全球化我的程序
<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>
UPDATE
我尝试了下面的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; }
说明:
HorizontalOffset获取应用程序窗口左侧与弹出窗口左侧之间的距离.
类似地,垂直偏移量获得窗口顶部和弹出窗口顶部之间的距离
因为我们必须将它对齐,所以我们必须从应用程序窗口的宽度和高度中减去弹出窗口的宽度和高度的一半(弹出窗口的中心是弹出窗口距离它的顶部和左边界的一半) )
代码是用Loaded =“LoginPopup_Loaded_1”事件编写的,因为当在应用程序窗口中呈现元素时会调用此事件并且因为它是所有子元素的容器Grid而被占用Grid.
我希望很清楚:)