Bagaimana cara memastikan kontrol Popup cocok dengan Halaman induknya ketika ukuran induk diubah? UWP

Saya memiliki Popup yang akan memenuhi seluruh halaman saat dibuka.

<Grid x:Name="gridRoot" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Button Content="Open" HorizontalAlignment="Center" Click="{x:Bind viewModel.OpenPopup}" />
    <Popup x:Name="popupCorrect" VerticalAlignment="Top" IsOpen="{Binding IsOpen}" IsLightDismissEnabled="False">
        <Popup.ChildTransitions>
            <TransitionCollection>
                <PaneThemeTransition Edge="Left" />
            </TransitionCollection>
        </Popup.ChildTransitions>
        <uc:MyPopup  Width="{Binding ElementName=gridRoot, Path=ActualWidth}" Height="{Binding ElementName=gridRoot, Path=ActualHeight}"/>
    </Popup>
</Grid>

Popup adalah Kontrol Pengguna

<Grid Background="Red">
    <Button Content="Close" HorizontalAlignment="Center" Click="{x:Bind viewModel.ClosePopup}" />
</Grid>
  1. Halaman

masukkan deskripsi gambar di sini

  1. Saat popup ditampilkan

masukkan deskripsi gambar di sini

  1. Tutup popup, ubah ukuran halaman, lalu buka kembali popup. Perhatikan bahwa ini tidak cocok dengan ukuran halaman penampung yang baru meskipun Width dan Height terikat ke gridRoot . Apakah saya harus menyetel Width dan Height baru secara manual untuk popup? Mengapa saya tidak bisa mencapai ini dengan mengikat? Masalah ini juga muncul di perangkat seluler selama 'OrientationChanged'

masukkan deskripsi gambar di sini


person PutraKg    schedule 19.03.2017    source sumber
comment
Bisakah menggunakan posisi mouse?   -  person lindexi    schedule 19.03.2017
comment
Bisakah Anda menjelaskannya lebih lanjut?   -  person PutraKg    schedule 19.03.2017
comment
Menetapkan ActualWidth sebagai sumber pengikatan biasanya tidak berfungsi seperti yang diharapkan. Lihat ini untuk info lebih lanjut.   -  person Decade Moon    schedule 19.03.2017
comment
Dalam konteks aplikasi Anda, dapatkah Anda menggunakan Flyout dan menyetel properti PlacementMode=Full?   -  person Lindsay    schedule 21.03.2017
comment
@Lindsay sayangnya tidak karena saya memiliki beberapa popup yang masing-masing berisi kontrol dan fungsi berbeda.   -  person PutraKg    schedule 21.03.2017


Jawaban (2)


Berdasarkan komentar Decade Moon, berikut cara mengubah ukuran popup agar sesuai dengan penampung induk seiring perubahan ukurannya.

Buat properti ketergantungan pada kode di belakang

    public double PageWidth
    {
        get { return (double)GetValue(PageWidthProperty); }
        set { SetValue(PageWidthProperty, value); }
    }

    public static readonly DependencyProperty PageWidthProperty =
        DependencyProperty.Register("PageWidth", typeof(double), typeof(GamePage), new PropertyMetadata(0d));



    public double PageHeight
    {
        get { return (double)GetValue(PageHeightProperty); }
        set { SetValue(PageHeightProperty, value); }
    }

    public static readonly DependencyProperty PageHeightProperty =
        DependencyProperty.Register("PageHeight", typeof(double), typeof(GamePage), new PropertyMetadata(0d));

Perbarui nilai pada acara SizeChanged

    private void GamePage_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        if (e.NewSize.Width > 0d && e.NewSize.Height > 0d)
        {
            PageWidth = e.NewSize.Width;
            PageHeight = e.NewSize.Height;
        }
    }

Kemudian di XAML, cukup gunakan x:Bind untuk mengikat lebar dan tinggi popup

        <Popup x:Name="popupCorrect" VerticalAlignment="Top" IsOpen="{Binding IsPopupCorrectOpen, Mode=TwoWay}" IsLightDismissEnabled="False">
        <Popup.ChildTransitions>
            <TransitionCollection>
                <PaneThemeTransition Edge="Left" />
            </TransitionCollection>
        </Popup.ChildTransitions>
        <uc:PopupCorrect Width="{x:Bind PageWidth, Mode=TwoWay}" Height="{x:Bind PageHeight, Mode=TwoWay}"/>
    </Popup>

Cukup lurus ke depan. Ingatlah untuk tidak menggunakan properti ActualWidth atau ActualHeight untuk mengikat sumber sebagai mereka tidak menaikkan PropertyChanged acara.

Meskipun memiliki bidang pendukung ActualWidthProperty, ActualWidth tidak memunculkan pemberitahuan perubahan properti dan harus dianggap sebagai properti CLR biasa dan bukan properti ketergantungan.

Untuk tujuan pengikatan ElementName, ActualWidth tidak memposting pembaruan ketika berubah (karena sifatnya yang tidak sinkron dan dihitung waktu proses). Jangan mencoba menggunakan ActualWidth sebagai sumber pengikatan untuk pengikatan ElementName. Jika Anda memiliki skenario yang memerlukan pembaruan berdasarkan ActualWidth, gunakan pengendali SizeChanged.

person PutraKg    schedule 20.03.2017

@PutraKg punya cara yang bagus.

Tapi saya punya dua cara untuk menyelesaikannya.

Yang pertama adalah mengatur VerticalAlignment="Center" HorizontalAlignment="Center" yang dapat membuat popup di tengah.

Namun menurut saya Anda tidak puas jika menempatkannya di tengah.

Cara terbaiknya adalah menggunakan posisi layar.

Anda bisa mendapatkan posisi layar Grid dan menjadikannya popup.

Di tombol terbuka

    private void Button_OnClick(object sender, RoutedEventArgs e)
    {
        var grid = (UIElement)popupCorrect.Parent; //get grid
        var p = grid.TransformToVisual (Window.Current.Content).TransformPoint(new Point(0, 0)); //get point
        popupCorrect.HorizontalOffset = p.X;
        popupCorrect.VerticalOffset = p.Y;
        popupCorrect.IsOpen = !popupCorrect.IsOpen;
    }
person lindexi    schedule 20.03.2017
comment
Ya, saya tidak ingin hanya menempatkan popup di tengah. Sayangnya untuk solusi ini, popup hanya cocok dengan wadah induk saat diklik. Ketika induk diubah ukurannya saat popup dibuka, ukurannya tidak akan diubah secara otomatis. Terima kasih atas sarannya. - person PutraKg; 20.03.2017