Saya memiliki kontrol pengguna yang saya muat ke dalam MainWindow
saat runtime. Saya tidak bisa mendapatkan pegangan di jendela yang berisi dari jendela UserControl
.
Saya sudah mencoba this.Parent
, tetapi selalu nol. Adakah yang tahu cara mendapatkan pegangan ke jendela yang berisi dari kontrol pengguna di WPF?
Berikut adalah cara kontrol dimuat:
private void XMLLogViewer_MenuItem_Click(object sender, RoutedEventArgs e)
{
MenuItem application = sender as MenuItem;
string parameter = application.CommandParameter as string;
string controlName = parameter;
if (uxPanel.Children.Count == 0)
{
System.Runtime.Remoting.ObjectHandle instance = Activator.CreateInstance(Assembly.GetExecutingAssembly().FullName, controlName);
UserControl control = instance.Unwrap() as UserControl;
this.LoadControl(control);
}
}
private void LoadControl(UserControl control)
{
if (uxPanel.Children.Count > 0)
{
foreach (UIElement ctrl in uxPanel.Children)
{
if (ctrl.GetType() != control.GetType())
{
this.SetControl(control);
}
}
}
else
{
this.SetControl(control);
}
}
private void SetControl(UserControl control)
{
control.Width = uxPanel.Width;
control.Height = uxPanel.Height;
uxPanel.Children.Add(control);
}
Saya akan menambahkan pengalaman saya. Meskipun menggunakan acara Loaded dapat melakukan pekerjaan, saya pikir mungkin lebih cocok untuk mengganti metode OnInitialized. Loaded terjadi setelah jendela pertama kali ditampilkan. OnInitialized memberi Anda kesempatan untuk membuat perubahan apa pun, misalnya, menambahkan kontrol ke jendela sebelum diberikan.
sumber
Window.GetWindow
masih kembalinull
diOnInitialized
. Tampaknya hanya bekerja diLoaded
acara tersebut.Coba gunakan VisualTreeHelper.GetParent atau gunakan fungsi rekursif di bawah untuk menemukan jendela induk.
sumber
Saya perlu menggunakan metode Window.GetWindow (ini) dalam Loaded event handler. Dengan kata lain, saya menggunakan jawaban kedua Ian Oakes dalam kombinasi dengan jawaban Alex untuk mendapatkan orang tua kontrol pengguna.
sumber
Pendekatan ini berhasil bagi saya tetapi tidak spesifik seperti pertanyaan Anda:
sumber
Jika Anda menemukan pertanyaan ini dan VisualTreeHelper tidak berfungsi untuk Anda atau bekerja secara sporadis, Anda mungkin perlu memasukkan LogicalTreeHelper dalam algoritme Anda.
Inilah yang saya gunakan:
sumber
LogicalTreeHelper.GetParent
dalam kode.Bagaimana dengan ini:
sumber
Saya telah menemukan bahwa induk dari UserControl selalu nol di konstruktor, tetapi dalam setiap penangan acara induk diatur dengan benar. Saya kira itu pasti ada hubungannya dengan cara pohon kontrol dimuat. Jadi untuk menyiasati ini, Anda bisa mendapatkan induk di acara kontrol Loaded.
Sebagai contoh checkout pertanyaan ini DataContext Kontrol Pengguna WPF adalah Null
sumber
Cara lain:
sumber
Ini bekerja untuk saya:
sumber
Ini tidak berfungsi untuk saya, karena terlalu jauh ke atas pohon, dan mendapatkan jendela root absolut untuk seluruh aplikasi:
Namun, ini berhasil untuk mendapatkan jendela langsung:
sumber
sumber
sumber
Edisi berlapis emas di atas (saya perlu fungsi generik yang dapat menyimpulkan
Window
dalam konteksMarkupExtension
: -MyWrapper.Owner()
akan menyimpulkan Window dengan benar sebagai berikut:Window
dengan berjalan pohon visual (jika digunakan dalam konteks aUserControl
)Window
markup)sumber
Pendekatan dan strategi yang berbeda. Dalam kasus saya, saya tidak dapat menemukan jendela dialog saya baik melalui menggunakan VisualTreeHelper atau metode ekstensi dari Telerik untuk menemukan induk dari tipe yang diberikan. Sebagai gantinya, saya menemukan tampilan dialog saya yang menerima suntikan konten khusus menggunakan Application.Current.Windows.
sumber
The
Window.GetWindow(userControl)
akan kembali jendela yang sebenarnya hanya setelah jendela itu diinisialisasi (InitializeComponent()
metode selesai).Ini berarti, bahwa jika kontrol pengguna Anda diinisialisasi bersama dengan jendelanya (misalnya Anda memasukkan kontrol pengguna Anda ke file xaml jendela), maka pada acara kontrol pengguna
OnInitialized
Anda tidak akan mendapatkan jendela (itu akan menjadi nol), karena di hal ini yang menyebabkan kontrol penggunaOnInitialized
diaktifkan sebelum jendela diinisialisasi.Ini juga berarti bahwa jika kontrol pengguna Anda diinisialisasi setelah jendelanya, maka Anda bisa mendapatkan jendela itu di konstruktor kontrol pengguna.
sumber
Jika Anda hanya ingin mendapatkan orang tua tertentu, tidak hanya jendela, orang tua tertentu dalam struktur pohon, dan juga tidak menggunakan rekursi, atau penghitung loop keras, Anda dapat menggunakan yang berikut ini:
Hanya saja, jangan letakkan panggilan ini di konstruktor (karena
Parent
properti belum diinisialisasi). Tambahkan di pengatur acara pemuatan, atau di bagian lain dari aplikasi Anda.sumber