5

次のコードを使用してポップアップを作成しましたが、中央に配置する方法がわかり
ません。実行時にマージンを自動的に変更しようとしましたが、その方法はわかりませんでした。ポップアップを中央に配置するには?
プログラムをグローバル化する必要があるため、標準的な次元がありません

<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;
}
4

3 に答える 3

9

これがあなたの問題の解決策です。私は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 が取得されるため、コードは event に記述されます。

私はmが明確であることを望みます:)

于 2012-12-17T06:15:43.513 に答える
1

Re : また、画面を回転させた状態で Loaded を実行することはできますか? – The87Boy 24 分前

これに対する答えは「はい」です。メソッドを作成し、そのメソッドを呼び出すことで同じコード セットを実行できます。Window.Current.SizeChanged += Current_SizeChanged;

 void Current_SizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e)
    {
        //call custom method from loaded event as well as size changed event
    }
于 2012-12-17T13:01:15.437 に答える
0

x:name および name 属性について、私が説明することは、以下のリンクに書かれているものと同じになると尋ねました

x:名前と名前の違い Silverlight

WPFのこのリンクも参照してください

WPF では、x:Name 属性と Name 属性の違いは何ですか?

私の一般的な理解によると、名前はクラスのプロパティです(例:GridまたはTextBlockなど)が、name属性を持たないクラスには何らかの方法でアクセスする必要があります(例:StoryBoardなど)その目的のためにx:名前が提供されます。initializecomponent メソッドの呼び出し中に、x:name と名前はFindName(string)メソッドを使用してクラスにマップされ、アクセスできるようになります。

今、内部で起こっていることは長い話です

MainPage.xaml -> MainPage.gics -> MainPage.xaml.cs

于 2012-12-17T12:57:54.643 に答える