InitializeComponent () ne yapar ve WPF'de nasıl çalışır?


166

Ne yapar InitializeComponent()yapmak ve WPF nasıl çalışır?

Genel olarak, ama özellikle inşaat sırasının kanlı ayrıntılarını ve Ekli Özellikler olduğunda ne olacağını bilmek isterim.


2
Teşekkürler, bence bunlar aşağıda oldukça iyi cevaplar! Hiç kimse AttachedProperties tam olarak bahsetti, ama şimdi Xaml herhangi bir AttachedProperties sadece Xaml ayrıştırma bir parçası olarak oluşturulduğunu biliyorum, bu yüzden gerçekten özel bir söz hak etmiyor.
Tim Lovell-Smith

Yanıtlar:


157

Çağrı InitializeComponent()(genellikle, en azından varsayılan oluşturucu denir Windowve UserControl) gerçekten kontrol (yerine ilk tahmin olarak hedef hiyerarşi kadar bir çağrı) kısmi sınıf için bir yöntem çağrıdır.

Bu yöntem , yüklenen Window/ için XAML'ye bir URI bulur UserControlve System.Windows.Application.LoadComponent()statik yönteme iletir. LoadComponent()iletilen URI'da bulunan XAML dosyasını yükler ve XAML dosyasının kök öğesi tarafından belirtilen nesnenin bir örneğine dönüştürür.

Daha ayrıntılı olarak, LoadComponentbir örneğini oluşturur XamlParserve XAML'nin bir ağacını oluşturur. Her düğüm XamlParser.ProcessXamlNode(). Bu BamlRecordWritersınıfa geçer. Bundan bir süre sonra BAML'in nesnelere nasıl dönüştürüldüğü konusunda biraz kayboluyorum, ama bu aydınlanma yolunda size yardımcı olmak için yeterli olabilir.

Not: İlginç bir şekilde, bu arabirimde, kısmen oluşturulan sınıfta uygulanan / uygulanan InitializeComponentbir yöntemdir .System.Windows.Markup.IComponentConnectorWindowUserControl

Bu yardımcı olur umarım!


@Brad, InitializeComponent'in hangi arayüzde tanımlandığını nasıl buldunuz? F1 yardımı .xaml.cs dosya yol açar çağrısında "sayfa bulunamadı" yol açar .g.cs veya .gics dosya Microsoft.SPOT.Emulator.EmulatorComponent sınıf yol açar. WPF'de yeniyim. Bu yöntem oluşturma zamanında oluşturulmuş mu?
Vimes

@ АртёмЦарионов Yapıcıda InitializeComponent çağrısı olmadan, kontrol bulunduğu XAML'de görüntülenmez veya kullanılamaz.
Jason

İlginç. Ben xaml sadece derleme sırasında kullanıldığını izlenimi altındaydı .. xaml çalışma zamanında kullanılabilir ve nerede saklanır?
Jesper Matthiesen

Neden bazı yöntemler bana "bir nesne örneği üzerinde nesne başvurusu ayarlanmadı" veriyor. ?
Peter Gruppelaar

26

Koda bakmak her zaman yardımcı olur. Yani, aşağıdakileri yaparak oluşturulan kısmi sınıfa ( LoadComponent'i çağıran ) bir göz atabilirsiniz :

  1. İlgilendiğiniz Visual Studio çözümündeki Çözüm Gezgini bölmesine gidin.
  2. Çözüm Gezgini'nin araç çubuğunda 'Tüm Dosyaları Göster' başlıklı bir düğme vardır. Bu düğmeyi aç / kapat.
  3. Şimdi, obj klasörünü ve ardından Debug veya Release klasörünü (veya inşa ettiğiniz herhangi bir yapılandırmayı) genişletin ve YourClass .g.cs başlıklı bir dosya göreceksiniz.

YourClass .g.cs ... oluşturulan kısmi sınıf için kodudur. Yine, bunu açarsanız InitializeComponent yöntemini ve LoadComponent'i nasıl çağırdığını ... ve çok daha fazlasını görebilirsiniz.


12
Bunu yapıcıda yöntem çağrısını sağ tıklayıp "Tanıma Git" i seçerek tek adımda yapabileceğinizi unutmayın.
Brad Leach

2
Ah, bu doğru ... unutmuşum. Bu şekilde çok daha kolay. En azından projeye nasıl dahil edildiğini biliyorsunuz. Sırıtış.
cplotts

1
@Brad Leach, Bu partiye geç, F12
Julius Depulla ile yapabilirsiniz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.