Karma Uygulama Sorunlarını Giderme
bu konuda, hem WPF hem de Windows Forms teknolojilerini kullanan karma uygulamalar yazarken oluşabilecek bazı yaygın sorunlar listelenmektedir.
Çakışan denetimler
Denetimler, bekledikleri gibi çakışmayabilir. Windows Forms her denetim için ayrı bir HWND kullanır. WPF, sayfadaki tüm içerik için bir HWND kullanır. Bu uygulama farkı, beklenmeyen çakışan davranışlara neden olur.
wpf 'de barındırılan bir Windows Forms denetimi her zaman wpf içeriğinin en üstünde görünür.
Denetimde barındırılan WPF içeriği, ElementHost denetimin z düzeninde görüntülenir ElementHost . Denetimleri örtüştürmek mümkündür ElementHost , ancak BARıNDıRıLAN WPF içeriği birleştirmez veya etkileşime almaz.
Alt özellik
WindowsFormsHostVe ElementHost sınıfları yalnızca tek bir alt denetimi veya öğesini barındırabilirler. Birden fazla denetimi veya öğeyi barındırmak için alt içerik olarak bir kapsayıcı kullanmanız gerekir. örneğin, bir denetime Windows Forms düğme ve onay kutusu denetimleri ekleyebilir System.Windows.Forms.Panel ve sonra paneli bir WindowsFormsHost denetimin Child özelliğine atayabilirsiniz. Ancak, düğme ve onay kutusu denetimlerini aynı denetime ayrı olarak ekleyemezsiniz WindowsFormsHost .
Ölçeklendirme
WPF ve Windows Forms farklı ölçekleme modellerine sahiptir. bazı WPF ölçekleme dönüştürmeleri Windows Forms denetimlerine göre anlamlıdır, ancak diğerleri değildir. örneğin, bir Windows Forms denetimini 0 olarak ölçeklendirmeye çalışır, ancak aynı denetimi sıfır olmayan bir değere ölçeklendirmeye çalışırsanız, denetimin boyutu 0 kalır. Daha fazla bilgi için bkz. WindowsFormsHost öğesi Için düzen konuları.
Bağdaştırıcı
WindowsFormsHostElementHost Gizli bir kapsayıcı içerdiğinden ve sınıfları çalışırken karışıklığa neden olabilir. Hem WindowsFormsHost hem de ElementHost sınıflarının, içerik barındırmak için kullandıkları WindowsFormsHostolarak adlandırılan gizli bir kapsayıcısı vardır. Öğesi için WindowsFormsHost Bağdaştırıcı System.Windows.Forms.ContainerControl sınıfından türetilir. Denetim için ElementHost Bağdaştırıcı öğesinden türetilir DockPanel . Diğer birlikte çalışabilirlik konularında bağdaştırıcıya yönelik başvuruları gördüğünüzde, bu kapsayıcı ele alınmıştır.
İç içe geçme
Bir denetimin içindeki bir öğenin iç içe geçirilmesi WindowsFormsHostElementHost desteklenmez. ElementHostBir denetimin bir öğe içinde iç içe geçirilmesi WindowsFormsHost de desteklenmez.
Odaklanma
odak, WPF ve Windows Forms farklı çalışır, bu da odak sorunlarının karma uygulamada gerçekleşebileceği anlamına gelir. Örneğin, bir öğesi içine odaklandıysanız WindowsFormsHost ve sayfayı en aza indirip geri yükledikten veya kalıcı iletişim kutusunu gösterdiğinizde, öğe içinde odak WindowsFormsHost kaybolabilir. WindowsFormsHostÖğe hala odağa sahip ancak içindeki denetim bu olmayabilir.
Veri doğrulama de odaklanarak etkilenir. Doğrulama bir öğede çalışır WindowsFormsHost , ancak WindowsFormsHost öğe veya iki farklı öğe arasında sekme olarak çalışmaz WindowsFormsHost .
Özellik Eşlemesi
bazı özellik eşlemeleri WPF ve Windows Forms teknolojileri arasında benzer uygulamaları köprülemek için kapsamlı bir yorum gerektirir. Özellik eşlemeleri, kodunuzun yazı tiplerinde, renklerde ve diğer özelliklerde yapılan değişikliklere tepki vermesini sağlar. Genel olarak özellik eşlemeleri, özellikdeğişmiş olayları ya daözellikdeğişmiş çağrıları dinleyerek ve alt denetimde veya bağdaştırıcısında uygun özellikleri ayarlayarak çalışır. daha fazla bilgi için bkz. Windows Forms ve WPF özellik eşleme.
Barındırılan Içerikte düzenle ilgili özellikler
WindowsFormsHost.ChildVeya ElementHost.Child özelliği atandığında, barındırılan içerikteki bazı düzenle ilgili özellikler otomatik olarak ayarlanır. Bu içerik özelliklerini değiştirmek beklenmeyen düzen davranışlarına neden olabilir.
Barındırılan içeriğiniz ve üst öğesini dolduracak şekilde yerleştirildi WindowsFormsHostElementHost . Bu Fill davranışını etkinleştirmek için, alt özelliği ayarladığınızda birçok özellik ayarlanır. Aşağıdaki tabloda, ve sınıfları tarafından hangi içerik özelliklerinin ayarlandığı listelenmektedir ElementHostWindowsFormsHost .
| Ana bilgisayar sınıfı | İçerik özellikleri |
|---|---|
| ElementHost | Height Width Margin VerticalAlignment HorizontalAlignment |
| WindowsFormsHost | Margin Dock AutoSize Location MaximumSize |
Bu özellikleri doğrudan barındırılan içerikte ayarlamayın. Daha fazla bilgi için bkz. WindowsFormsHost öğesi Için düzen konuları.
Gezinti uygulamaları
Gezinti uygulamaları Kullanıcı durumunu koruyamayabilir. WindowsFormsHostÖğesi, bir gezinti uygulamasında kullanıldığında denetimlerini yeniden oluşturur. Alt denetimleri yeniden oluşturmak, kullanıcı öğeyi barındıran sayfadan uzaklaştığında WindowsFormsHost ve ardından buna döndüğünde oluşur. Kullanıcı tarafından yazılan içerikler kaybedilir.
İleti döngüsü birlikte çalışma
Windows Forms ileti döngülerinde çalışırken, iletiler beklendiği gibi işlenmeyebilir. EnableWindowsFormsInteropYöntemi, Oluşturucu tarafından çağrılır WindowsFormsHost . Bu yöntem WPF ileti döngüsüne bir ileti filtresi ekler. Bu filtre, Control.PreProcessMessage bir System.Windows.Forms.Control ileti hedefi ise ve iletiyi çevirdiğinde/dağıtırsa yöntemini çağırır.
Windowile Windows Forms bir ileti döngüsünde Application.Run , yöntemi çağırmadığınız takdirde hiçbir şey belirtemezsiniz EnableModelessKeyboardInterop . EnableModelessKeyboardInteropYöntemi bir alır Window ve System.Windows.Forms.IMessageFilter WPF ileti döngüsüne reroutes anahtarla ilgili iletileri ekler. daha fazla bilgi için bkz. Windows Forms ve WPF birlikte çalışabilirlik giriş mimarisi.
Opaklık ve katmanlama
HwndHostSınıfı katmanlanın desteklemez. Bu, Opacity öğesinde özelliği ayarlamanın WindowsFormsHost hiçbir etkisi olmadığı ve olarak AYARLANMıŞ diğer WPF pencereleri ile hiçbir karıştırma gerçekleşmeyeceği anlamına gelir AllowsTransparencytrue .
Dispose
Sınıfların elden atılırken kaynakları sızmasını sağlayabilirsiniz. Karma uygulamalarınızda, WindowsFormsHost ve ElementHost sınıflarının atıldığından emin olun veya kaynakları sızdırabilirsiniz. ElementHostkalıcı olmayan üst öğe kapandığında denetimleri ortadan kaldırWindows Forms Form . WPF, WindowsFormsHost uygulamanız kapandığında öğeleri atar. WindowsFormsHostbir Windows Forms ileti döngüsünde bir öğe göstermek mümkündür Window . Bu durumda, kodunuz uygulamanızın kapanmakta olduğu bildirimini alamayabilir.
Görsel stilleri etkinleştirme
bir Windows Forms denetimindeki Microsoft Windows XP görsel stilleri etkinleştirilmemiş olabilir. Application.EnableVisualStylesyöntemi, Windows Forms bir uygulama için şablonunda çağırılır. bu yöntem varsayılan olarak çağrılmasa da, bir proje oluşturmak için Visual Studio kullanıyorsanız, Comctl32.dll 6,0 sürümü varsa, denetimler için Microsoft Windows XP görsel stilleri alırsınız. EnableVisualStylesİş parçacığında işleyiciler oluşturulmadan önce yöntemini çağırmanız gerekir. Daha fazla bilgi için bkz. nasıl yapılır: karma uygulamada görsel stilleri etkinleştirme.
Lisanslı denetimler
lisans bilgilerini kullanıcıya bir ileti kutusunda görüntüleyen lisanslı Windows Forms denetimleri, karma uygulama için beklenmeyen davranışlara neden olabilir. Bazı lisanslı denetimler, oluşturma tanıtıcısının yanıt olarak bir iletişim kutusu gösterir. Örneğin, lisanslı bir denetim kullanıcıya bir lisansın gerekli olduğunu veya kullanıcının bu denetimin üç deneme sürümünü kullandığını bildirebilir.
WindowsFormsHostÖğesi HwndHost sınıfından türetilir ve alt denetimin tanıtıcısı yöntemin içinde oluşturulur BuildWindowCore . HwndHostSınıf, metotta iletilerin işlenmesine izin vermez BuildWindowCore , ancak bir iletişim kutusunun görüntülenmesi iletilerin gönderilmesine neden olur. Bu lisans senaryosunu etkinleştirmek için, Control.CreateControl denetimin yöntemini öğenin alt öğesi olarak atamadan önce çağırın WindowsFormsHost .
WPF Tasarımcısı
Visual Studio için WPF tasarımcısını kullanarak WPF içeriğinizi tasarlayabilirsiniz. Aşağıdaki bölümlerde, WPF Tasarımcısı ile karma uygulamalar yazarken oluşabilecek bazı yaygın sorunlar listelenmektedir.
BackColorTransparent, tasarım zamanında yoksayılıyor
BackColorTransparentÖzellik tasarım zamanında beklendiği gibi çalışmayabilir.
WPF denetimi görünür bir üst öğede değilse, WPF çalışma zamanı BackColorTransparent değeri yoksayar. BackColorTransparentYok sayılabilir olmasının nedeni ElementHost nesnenin ayrı bir şekilde oluşturulması olabilir AppDomain . Ancak, uygulamayı çalıştırdığınızda BackColorTransparent beklendiği gibi çalışır.
Tasarım Zamanı Hata Listesi obj klasörü silindiğinde görüntülenir
Obj klasörü silinirse, Tasarım Zamanı Hata Listesi görüntülenir.
kullanarak tasarladığınızda ElementHost Windows Form Tasarımcısı, projenizin obj klasöründeki hata ayıklama veya yayınlama klasöründe oluşturulan dosyaları kullanır. Bu dosyaları silerseniz tasarım zamanı Hata Listesi görüntülenir. Bu sorunu gidermek için projenizi yeniden derleyin. Daha fazla bilgi için bkz. Windows Forms Tasarımcısı'nda Tasarım Zamanı Hataları.
ElementHost ve IME
içinde barındırılan WPF ElementHost denetimleri şu anda özelliğini ImeMode desteklemez. üzerinde yapılan ImeMode değişiklikler barındırılan denetimler tarafından yoksayılır.
Ayrıca bkz.
- ElementHost
- WindowsFormsHost
- WPF Tasarımcısında Birlikte Çalışabilirlik
- Windows Forms ve WPF Birlikte Çalışabilirlik Giriş Mimarisi
- Nasıl yapılır: Karma Uygulamada Görsel Stilleri Etkinleştirme
- WindowsFormsHost Öğesi için Düzen Konusunda Dikkat Edilmesi Gereken Noktalar
- Windows Forms ve WPF Özelliğini Eşleme
- Windows Formları Tasarımcısında Tasarım Zamanı Hataları
- Geçiş ve Birlikte Çalışabilirlik