İzlenecek yol: WPF’de Windows Forms Denetimlerini Düzenleme
Bu kılavuzda, karma bir uygulamada Formlar denetimlerini düzenlemek Windows WPF düzeni özelliklerini nasıl kullanabileceğiniz açıklanır.
Bu kılavuzda gösterilen görevler şunlardır:
- Projeyi oluşturma.
- Varsayılan düzen ayarlarını kullanma.
- İçerik olarak boyutlandırma.
- Mutlak konumlandırmayı kullanma.
- Boyutu açıkça belirtme.
- Düzen özelliklerini ayarlama.
- z-order sınırlamalarını anlama.
- Takma.
- Görünürlüğü ayarlama.
- Uzatmayan bir denetim barındırma.
- Ölçekleme.
- Dönen.
- Doldurma ve kenar boşluklarını ayarlama.
- Dinamik düzen kapsayıcılarını kullanma.
Bu kılavuzda gösterilen görevlerin tam kod listesi için bkz. WPF Örneğinde Windows Form Denetimlerini Düzenleme.
Bitirdikten sonra, WPF tabanlı uygulamalarda Windows Forms düzeni özelliklerini anlıyabilirsiniz.
Önkoşullar
Bu Visual Studio tamamlamanız gerekir.
Projeyi Oluşturma
Projeyi oluşturmak ve ayarlamak için şu adımları izleyin:
adlı bir WPF Uygulaması projesi
WpfLayoutHostingWfoluşturun.Aşağıdaki Çözüm Gezgini derlemelere başvurular ekleyin:
- WindowsFormsIntegration
- Sistem. Windows. Forms
- System.Drawing
MainWindow.xaml'e çift tıklar ve XAML görünümünde açın.
öğesine Window aşağıdaki form formlarını Windows ekleyin.
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"öğesinde Grid özelliğini olarak ayarlayın ve beş satır ve üç sütun ShowGridLines
truetanımlayın.<Grid ShowGridLines="true"> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions>
Varsayılan Düzen Ayarlar
Varsayılan olarak, WindowsFormsHost öğesi barındırılan Formlar denetimi için Windows düzenler.
Varsayılan düzen ayarlarını kullanmak için şu adımları izleyin:
Aşağıdaki XAML'i öğesine Grid kopyalayın:
<!-- Default layout. --> <Canvas Grid.Row="0" Grid.Column="0"> <WindowsFormsHost Background="Yellow"> <wf:Button Text="Windows Forms control" FlatStyle="Flat"/> </WindowsFormsHost> </Canvas>Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. Windows Forms denetimi System.Windows.Forms.Button içinde Canvas görünür. Barındırılan denetim içeriğine göre boyutlandırıldı ve öğe WindowsFormsHost barındırılan denetime uyum sağlayacak şekilde boyutlandırıldı.
İçerik Olarak Boyutlandırma
WindowsFormsHostöğesi, barındırılan denetimin içeriğini düzgün bir şekilde görüntülayacak şekilde boyutlandırıldıklarını sağlar.
İçeriğin boyutunu yapmak için şu adımları izleyin:
Aşağıdaki XAML'i öğesine Grid kopyalayın:
<!-- Sizing to content. --> <Canvas Grid.Row="1" Grid.Column="0"> <WindowsFormsHost Background="Orange"> <wf:Button Text="Windows Forms control with more content" FlatStyle="Flat"/> </WindowsFormsHost> </Canvas> <Canvas Grid.Row="2" Grid.Column="0"> <WindowsFormsHost FontSize="24" Background="Yellow"> <wf:Button Text="Windows Forms control" FlatStyle="Flat"/> </WindowsFormsHost> </Canvas>Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. İki yeni düğme denetimi, daha uzun metin dizesini ve daha büyük yazı tipi boyutunu düzgün şekilde görüntülayacak şekilde boyutlandırılır ve öğeler barındırılan denetimlere WindowsFormsHost uyum sağlayacak şekilde yeniden boyutlandırılır.
Mutlak Konumlandırmayı Kullanma
Öğeyi kullanıcı arabiriminde WindowsFormsHost (UI) herhangi bir yere konumlandırmak için mutlak konumlandırmayı kullanabilirsiniz.
Mutlak konumlandırmayı kullanmak için şu adımları izleyin:
Aşağıdaki XAML'i öğesine Grid kopyalayın:
<!-- Absolute positioning. --> <Canvas Grid.Row="3" Grid.Column="0"> <WindowsFormsHost Canvas.Top="20" Canvas.Left="20" Background="Yellow"> <wf:Button Text="Windows Forms control with absolute positioning" FlatStyle="Flat"/> </WindowsFormsHost> </Canvas>Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. öğesi, kılavuz hücrenin üst tarafından 20 piksel ve soldan WindowsFormsHost 20 piksel yerleştirilir.
Boyutu Açıkça Belirtme
ve özelliklerini kullanarak WindowsFormsHost öğenin boyutunu WidthHeight belirtebilirsiniz.
Boyutu açıkça belirtmek için şu adımları izleyin:
Aşağıdaki XAML'i öğesine Grid kopyalayın:
<!-- Explicit sizing. --> <Canvas Grid.Row="4" Grid.Column="0"> <WindowsFormsHost Width="50" Height="70" Background="Yellow"> <wf:Button Text="Windows Forms control" FlatStyle="Flat"/> </WindowsFormsHost> </Canvas>Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. öğesi, varsayılan düzen ayarlarından daha küçük olan 50 piksel genişliğinde WindowsFormsHost 70 piksel yüksek bir boyuta ayarlanır. Windows Forms denetimi içeriği uygun şekilde yeniden düzenlenmiştir.
Düzen Özelliklerini Ayarlama
Öğenin özelliklerini kullanarak her zaman barındırılan denetimde düzenle ilgili özellikleri WindowsFormsHost ayarlayın. Düzen özelliklerini doğrudan barındırılan denetimde ayarlama, planlanmamış sonuçlar verir.
XAML'de barındırılan denetimde düzenle ilgili özellikleri ayarlamanın hiçbir etkisi yoktur.
Barındırılan denetimde özellikleri ayarlamanın etkilerini görmek için şu adımları izleyin:
Aşağıdaki XAML'i öğesine Grid kopyalayın:
<!-- Setting hosted control properties directly. --> <Canvas Grid.Row="0" Grid.Column="1"> <WindowsFormsHost Width="160" Height="50" Background="Yellow"> <wf:Button Name="button1" Click="button1_Click" Text="Click me" FlatStyle="Flat" BackColor="Green"/> </WindowsFormsHost> </Canvas>Bu Çözüm Gezgini,Kod Düzenleyicisi'nde açmak için MainWindow.xaml.vb veya MainWindow.xaml.cs'ye çift tıklayın.
Aşağıdaki kodu sınıf
MainWindowtanımına kopyalayın:private void button1_Click(object sender, EventArgs e ) { System.Windows.Forms.Button b = sender as System.Windows.Forms.Button; b.Top = 20; b.Left = 20; }Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) Dim b As System.Windows.Forms.Button = sender b.Top = 20 b.Left = 20 End SubUygulamayı derlemek ve çalıştırmak için F5 tuşuna basın.
Bana tıklayın düğmesine tıklayın. Olay
button1_Clickişleyicisi, TopLeft barındırılan denetimde ve özelliklerini ayarlar. Bu, barındırılan denetimin öğesi içinde yeniden konumlandırılana neden WindowsFormsHost olur. Konak aynı ekran alanıyla aynıdır, ancak barındırılan denetim kırpılır. Bunun yerine, barındırılan denetim her zaman öğesini WindowsFormsHost doldurmalı.
Z Düzeni Sınırlamalarını Anlama
Görünür öğeler her zaman diğer WPF öğelerinin üzerine çizilir ve z düzeni WindowsFormsHost bundan etkilenmez. Bu z düzeni davranışını görmek için şunları yapın:
Aşağıdaki XAML'i öğesine Grid kopyalayın:
<!-- Z-order demonstration. --> <Canvas Grid.Row="1" Grid.Column="1"> <WindowsFormsHost Canvas.Top="20" Canvas.Left="20" Background="Yellow"> <wf:Button Text="Windows Forms control" FlatStyle="Flat"/> </WindowsFormsHost> <Label Content="A WPF label" FontSize="24"/> </Canvas>Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. öğesi WindowsFormsHost etiket öğesinin üzerine boyanmıştır.
Takma
WindowsFormsHost öğesi WPF yerleştirmeyi destekler. Barındırılan Dock denetimi bir öğeye yerleştiren ekli özelliği DockPanel ayarlayın.
Barındırılan bir denetimi yerleştirmek için şu adımları izleyin:
Aşağıdaki XAML'i öğesine Grid kopyalayın:
<!-- Docking a WindowsFormsHost element. --> <DockPanel LastChildFill="false" Grid.Row="2" Grid.Column="1"> <WindowsFormsHost DockPanel.Dock="Right" Canvas.Top="20" Canvas.Left="20" Background="Yellow"> <wf:Button Text="Windows Forms control" FlatStyle="Flat"/> </WindowsFormsHost> </DockPanel>Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. WindowsFormsHostöğesi, öğesinin sağ tarafına DockPanel yerleştirildi.
Görünürlüğü Ayarlama
Windows Forms denetiminizi görünmez hale veya öğesinde özelliğini Visibility ayarerek WindowsFormsHost daraltabilirsiniz. Denetim görünmez olduğunda görüntülenmez, ancak düzen alanı kaplar. Bir denetim daraltılmışsa görüntülenmez ve düzen alanı kaplar.
Barındırılan bir denetimin görünürlüğünü ayarlamak için şu adımları izleyin:
Aşağıdaki XAML'i öğesine Grid kopyalayın:
<!-- Setting Visibility to hidden and collapsed. --> <StackPanel Grid.Row="3" Grid.Column="1"> <Button Name="button2" Click="button2_Click" Content="Click to make invisible" Background="OrangeRed"/> <WindowsFormsHost Name="host1" Background="Yellow"> <wf:Button Text="Windows Forms control" FlatStyle="Flat"/> </WindowsFormsHost> <Button Name="button3" Click="button3_Click" Content="Click to collapse" Background="OrangeRed"/> </StackPanel>MainWindow.xaml.vb veya MainWindow.xaml.csiçinde, aşağıdaki kodu sınıf tanımına kopyalayın:
private void button2_Click(object sender, EventArgs e) { this.host1.Visibility = Visibility.Hidden; } private void button3_Click(object sender, EventArgs e) { this.host1.Visibility = Visibility.Collapsed; }Private Sub button2_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Me.host1.Visibility = Windows.Visibility.Hidden End Sub Private Sub button3_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Me.host1.Visibility = Windows.Visibility.Collapsed End SubUygulamayı derlemek ve çalıştırmak için F5 tuşuna basın.
Öğeyi görünmez yapmak için Görünmez yapmak için tıklayın düğmesine tıklayın.
Öğeyi düzenden tamamen gizlemek için Daralt düğmesine tıklayın. Formlar Windows daraltılmışsa, çevresindeki öğeler alanı kaplayacak şekilde yeniden düzenlenmiştir.
Esnetmeyen Bir Denetimi Barındırma
Bazı Windows Forms denetimleri sabit bir boyuta sahiptir ve düzende kullanılabilir alanı doldurmak için esnetmez. Örneğin, denetim MonthCalendar sabit bir alanda bir ay görüntüler.
Esnetilen bir denetim barındırmak için şu adımları izleyin:
Aşağıdaki XAML'i öğesine Grid kopyalayın:
<!-- Hosting a control that does not stretch. --> <!-- The MonthCalendar has a discrete size. --> <StackPanel Grid.Row="4" Grid.Column="1"> <Label Content="A WPF element" Background="OrangeRed"/> <WindowsFormsHost Background="Yellow"> <wf:MonthCalendar/> </WindowsFormsHost> <Label Content="Another WPF element" Background="OrangeRed"/> </StackPanel>Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. öğesi WindowsFormsHost kılavuz satırına ortalandı, ancak kullanılabilir alanı dolduracak şekilde esnetilmiş değildir. Pencere yeterince büyükse, barındırılan denetim tarafından iki veya daha fazla ay görüntülenebilir, ancak bunlar MonthCalendar satırda ortalanıyor olabilir. WPF düzeni altyapısı, kullanılabilir alanı dolduracak şekilde boyutlandırılamay öğeleri ortalar.
Ölçeklendirme
WPF öğelerinin aksine, Windows Forms denetimleri sürekli olarak ölçeklenebilir değildir. Özel ölçeklendirme sağlamak için yöntemini geçersiz WindowsFormsHost.ScaleChild kılar.
Barındırılan denetimi varsayılan davranışı kullanarak ölçeklendirmek için şu adımları izleyin:
Aşağıdaki XAML'i öğesine Grid kopyalayın:
<!-- Scaling transformation. --> <StackPanel Grid.Row="0" Grid.Column="2"> <StackPanel.RenderTransform> <ScaleTransform CenterX="0" CenterY="0" ScaleX="0.5" ScaleY="0.5" /> </StackPanel.RenderTransform> <Label Content="A WPF UIElement" Background="OrangeRed"/> <WindowsFormsHost Background="Yellow"> <wf:Button Text="Windows Forms control" FlatStyle="Flat"/> </WindowsFormsHost> <Label Content="Another WPF UIElement" Background="OrangeRed"/> </StackPanel>Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. Barındırılan denetim ve çevresindeki öğeler 0,5 faktörüyle ölçeklendirildi. Ancak, barındırılan denetimin yazı tipi ölçeklendirlanmaz.
Dönen
WPF öğelerinin aksine, Windows Forms denetimleri döndürmeyi desteklemez. Bir WindowsFormsHost döndürme dönüşümü uygulandığında öğe diğer WPF öğeleriyle birlikte döndürmez. 180 derece dışında herhangi bir döndürme değeri olayı LayoutError yükselter.
Karma uygulamada döndürmenin etkisini görmek için şu adımları izleyin:
Aşağıdaki XAML'i öğesine Grid kopyalayın:
<!-- Rotation transformation. --> <StackPanel Grid.Row="1" Grid.Column="2"> <StackPanel.RenderTransform> <RotateTransform CenterX="200" CenterY="50" Angle="180" /> </StackPanel.RenderTransform> <Label Content="A WPF element" Background="OrangeRed"/> <WindowsFormsHost Background="Yellow"> <wf:Button Text="Windows Forms control" FlatStyle="Flat"/> </WindowsFormsHost> <Label Content="Another WPF element" Background="OrangeRed"/> </StackPanel>Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. Barındırılan denetim döndürülemez, ancak çevresindeki öğeler 180 derecelik bir açıyla döndürülür. Öğeleri görmek için pencereyi yeniden boyutlandırmanız gerekir.
Doldurma ve Kenar Boşluklarını Ayarlama
WPF düzeninde doldurma ve kenar boşlukları, form formlarında doldurmaya ve kenar boşluklarına Windows benzer. Öğesinin Padding ve Margin özelliklerini ayarlamak için tek yapmanız WindowsFormsHost gereken.
Barındırılan bir denetim için doldurma ve kenar boşlukları ayarlamak için şu adımları izleyin:
Aşağıdaki XAML'i öğesine Grid kopyalayın:
<!-- Padding. --> <Canvas Grid.Row="2" Grid.Column="2"> <WindowsFormsHost Padding="0, 20, 0, 0" Background="Yellow"> <wf:Button Text="Windows Forms control with padding" FlatStyle="Flat"/> </WindowsFormsHost> </Canvas><!-- Margin. --> <Canvas Grid.Row="3" Grid.Column="2"> <WindowsFormsHost Margin="20, 20, 0, 0" Background="Yellow"> <wf:Button Text="Windows Forms control with margin" FlatStyle="Flat"/> </WindowsFormsHost> </Canvas>Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. Doldurma ve kenar boşluğu ayarları, barındırılan Windows Forms denetimlerine, Formlar'da uygulanmayacak şekilde Windows uygulanır.
Dinamik Düzen Kapsayıcılarını Kullanma
Windows Forms iki dinamik düzen kapsayıcısı ve FlowLayoutPanelTableLayoutPanel sağlar. Bu kapsayıcıları WPF düzenleri içinde de kullanabilirsiniz.
Dinamik düzen kapsayıcısı kullanmak için şu adımları izleyin:
Aşağıdaki XAML'i öğesine Grid kopyalayın:
<!-- Flow layout. --> <DockPanel Grid.Row="4" Grid.Column="2"> <WindowsFormsHost Name="flowLayoutHost" Background="Yellow"> <wf:FlowLayoutPanel/> </WindowsFormsHost> </DockPanel>MainWindow.xaml.vb veya MainWindow.xaml.csiçinde, aşağıdaki kodu sınıf tanımına kopyalayın:
private void InitializeFlowLayoutPanel() { System.Windows.Forms.FlowLayoutPanel flp = this.flowLayoutHost.Child as System.Windows.Forms.FlowLayoutPanel; flp.WrapContents = true; const int numButtons = 6; for (int i = 0; i < numButtons; i++) { System.Windows.Forms.Button b = new System.Windows.Forms.Button(); b.Text = "Button"; b.BackColor = System.Drawing.Color.AliceBlue; b.FlatStyle = System.Windows.Forms.FlatStyle.Flat; flp.Controls.Add(b); } }Private Sub InitializeFlowLayoutPanel() Dim flp As System.Windows.Forms.FlowLayoutPanel = Me.flowLayoutHost.Child flp.WrapContents = True Const numButtons As Integer = 6 Dim i As Integer For i = 0 To numButtons Dim b As New System.Windows.Forms.Button() b.Text = "Button" b.BackColor = System.Drawing.Color.AliceBlue b.FlatStyle = System.Windows.Forms.FlatStyle.Flat flp.Controls.Add(b) Next i End SubOluşturucuda
InitializeFlowLayoutPanelyöntemine bir çağrı ekleyin:public MainWindow() { InitializeComponent(); this.InitializeFlowLayoutPanel(); }Public Sub New() InitializeComponent() Me.InitializeFlowLayoutPanel() End SubUygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. WindowsFormsHostöğesi öğesini doldurur ve alt DockPanelFlowLayoutPanel denetimlerini varsayılan olarak FlowDirection ayarlar.
Ayrıca bkz.
- ElementHost
- WindowsFormsHost
- Visual Studio’da XAML tasarlama
- WindowsFormsHost Öğesi için Düzen Konusunda Dikkat Edilmesi Gereken Noktalar
- WPF Windows Form Denetimlerini Düzenleme
- İzlenecek yol: WPF'de Windows Forms Bileşik Denetimini Barındırma
- İzlenecek yol: WPF Bileşik Denetimini Windows Forms İçinde Barındırma