2012-12-16 16 views
5

Utworzono Popup za pomocą następującego kodu, ale nie mogę dowiedzieć się, jak go wyśrodkować
Próbowałem automatycznie zmienić margines czasu wykonywania, ale nie mogłem dowiedzieć się, jak to zrobić , ale czy ktoś ma pomysł, jak wyśrodkować popup?
Nie ma standardowy wymiar bo potrzebuję do globalizacji mój programCenter popup w XAMLCenter popup w 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> 

UPDATE

Próbowałem z odpowiedzią user1603313 jest poniżej, ale to nie załatwi, jak to mówi rozmiar siatki wewnątrz wyskakującego okienka to NaN.
Próbowałem też przenieść metodę do siatki, ale to nie załatwi albo
Sposób mówię jest to z siatki zaktualizowanej prawidłowo

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; 
} 
+0

Będziesz myśleć przycisków rozwijanych. http://msdn.microsoft.com/en-us/library/windows/apps/hh465354.aspx –

+0

@SinanErgin Podczas czytania Flyouts jest tylko dla HTML – The87Boy

+0

ah, to prawda. listy rozwijane nie mogą być używane xaml + C#/vb. Dobra praca;) –

Odpowiedz

8

Oto rozwiązanie dla Ciebie problemu . przepisuję kod xaml i wraz z modyfikacją i można znaleźć wyjaśnienie po kodzie.

 <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> 

Tutaj dodałem zdarzenie Loaded="LoginPopup_Loaded_1" do XAML z popup

Oto kod zdarzenia w języku 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; 
    } 

Objaśnienie:

HorizontalOffset pobiera odległość między lewą z boku okna aplikacji i lewej strony podręcznego okna.

Podobnie przesunięcie pionowe pobiera odległość między górnej części okna i górnej części okienko

ponieważ mamy do centrum wyrównać go więc musimy odjąć połowę szerokość i wysokość popup z szerokością a wysokość okna aplikacji (środek wyskakującego okna to połowa odległości wyskakującego okna od górnej i lewej granicy)

kod jest zapisywany w Loaded="LoginPopup_Loaded_1" zdarzeniu, ponieważ to zdarzenie jest wywoływane, gdy element jest renderowany w aplikacji okno i siatka są pobierane, ponieważ są siatką kontenera wszystkich elementów potomnych.

mam nadzieję, że jestem jasne :)

+0

To było to, czego szukałem, ale nie myślałem o Załadowanym;) Może możesz mi powiedzieć, jaka jest różnica między x: imieniem i nazwiskiem? Wydaje mi się, że byłem szybki, ponieważ mówi on, że wysokość i szerokość siatki to NaN – The87Boy

+0

A co z rozmiarem siatki? – The87Boy

+0

I czy można uruchomić Loaded, gdy ekran jest obracany? – The87Boy

0

o x: imię i nazwisko oraz nazwę atrybutu u zapytał, co wytłumaczę będzie to samo, co napisane w linku poniżej

x:name and name difference silverlight

a także przejść przez ten link do WPF

In WPF, what are the differences between the x:Name and Name attributes?

Jak na moje ogólnego zrozumienia nazwa jest ap roperty klasy (np. Grid lub TextBlock i wiele innych), ale klasy, które nie mają atrybutu name, muszą być dostępne w pewien sposób (np. StoryBoard itp.), dlatego do tego celu dostarczane jest x: name. Podczas wywoływania metody initializeconent nazwy x: name i name są odwzorowywane na klasę przy użyciu metody FindName(string), aby były dostępne.

teraz co się dzieje wewnętrznie jest długa historia uciąć

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

1

Re: A to jest możliwe uruchomienie załadowany, gdy ekran jest obracany? - The87Boy 24 minut temu

Odpowiedź na to jest tak można wykonać z tego samego zestawu kodu poprzez stworzenie metody i wywołanie tej metody na 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 
    }