İzlenecek yol: WPF'de Windows Forms Denetimlerini Düzenleme

Bu kılavuzda, karma bir uygulamada Windows Forms denetimlerini düzenlemek için WPF düzen özelliklerinin nasıl kullanılacağı gösterilmektedir.

Bu kılavuzda gösterilen görevler şunlardır:

  • Projeyi oluşturma.
  • Varsayılan düzen ayarlarını kullanma.
  • İçeriği boyutlandırma.
  • Mutlak konumlandırmayı kullanma.
  • Boyutu açıkça belirtme.
  • Düzen özelliklerini ayarlama.
  • Z düzeni sınırlamalarını anlama.
  • Takma.
  • Görünürlüğü ayarlama.
  • Esnetmeyen bir denetimi barındırma.
  • Ölçeklendirme.
  • 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 Forms Denetimlerini Düzenleme.

İşiniz bittiğinde, WPF tabanlı uygulamalarda Windows Forms düzen özelliklerini anlayacaksınız.

Ön koşullar

Bu kılavuzu tamamlamak için Visual Studio'ya ihtiyacınız vardır.

Projeyi Oluşturma

Projeyi oluşturmak ve ayarlamak için şu adımları izleyin:

  1. adlı WpfLayoutHostingWfbir WPF Uygulaması projesi oluşturun.

  2. Çözüm Gezgini aşağıdaki derlemelere başvurular ekleyin:

    • WindowsFormsIntegration
    • System.Windows.Forms
    • System.Drawing
  3. MainWindow.xaml'e çift tıklayarak XAML görünümünde açın.

  4. Window öğesine aşağıdaki Windows Forms ad alanı eşlemesini ekleyin.

    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
    
  5. öğesinde Grid özelliğini olarak true ayarlayın ShowGridLines ve beş satır ve üç sütun tanı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 Kullanma

Varsayılan olarak, öğesi barındırılan WindowsFormsHost Windows Forms denetiminin düzenini işler.

Varsayılan düzen ayarlarını kullanmak için şu adımları izleyin:

  1. Aşağıdaki XAML'yi Grid öğesine kopyalayın:

    <!-- Default layout. -->
    <Canvas Grid.Row="0" Grid.Column="0">
      <WindowsFormsHost Background="Yellow">
        <wf:Button Text="Windows Forms control" FlatStyle="Flat"/>
      </WindowsFormsHost>
    </Canvas>
    
  2. Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. Windows Forms System.Windows.Forms.Button denetimi içinde Canvasgörünür. Barındırılan denetim içeriğine göre boyutlandırılır ve öğesi barındırılan WindowsFormsHost denetimi barındıracak şekilde boyutlandırılır.

İçeriği Boyutlandırma

öğesi, WindowsFormsHost barındırılan denetimin içeriğini düzgün görüntüleyecek şekilde boyutlandırılmasını sağlar.

İçeriği boyutlandırmak için şu adımları izleyin:

  1. Aşağıdaki XAML'yi Grid öğesine 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>
    
  2. 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 görüntüleyecek şekilde boyutlandırılır ve öğeler barındırılan WindowsFormsHost denetimlere uyacak şekilde yeniden boyutlandırılır.

Mutlak Konumlandırmayı Kullanma

Öğesini kullanıcı arabiriminde (UI) herhangi bir yere yerleştirmek WindowsFormsHost için mutlak konumlandırmayı kullanabilirsiniz.

Mutlak konumlandırmayı kullanmak için şu adımları izleyin:

  1. Aşağıdaki XAML'yi Grid öğesine 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>
    
  2. Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. WindowsFormsHost öğesi kılavuz hücresinin üst tarafından 20 piksel ve soldan 20 piksel yerleştirilir.

Boyutu Açıkça Belirtme

öğesinin WindowsFormsHost boyutunu ve Height özelliklerini kullanarak Width belirtebilirsiniz.

Boyutu açıkça belirtmek için şu adımları izleyin:

  1. Aşağıdaki XAML'yi Grid öğesine 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>
    
  2. Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. WindowsFormsHost öğesi, varsayılan düzen ayarlarından daha küçük olan 50 piksel genişliğinde ve 70 piksel yüksekliğinde bir boyuta ayarlanır. Windows Forms denetiminin içeriği uygun şekilde yeniden düzenlenir.

Düzen Özelliklerini Ayarlama

Öğesinin özelliklerini kullanarak barındırılan denetimde her zaman düzen ile ilgili özellikleri WindowsFormsHost ayarlayın. Düzen özelliklerini doğrudan barındırılan denetimde ayarlamak istenmeyen sonuçlar verir.

XAML'de barındırılan denetimde düzen ile 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:

  1. Aşağıdaki XAML'yi Grid öğesine 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>
    
  2. Çözüm Gezgini'da MainWindow.xaml.vb veya MainWindow.xaml.cs dosyasına çift tıklayarak Kod Düzenleyicisi'nde açın.

  3. Aşağıdaki kodu sınıf tanımına MainWindow 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 Sub
    
  4. Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın.

  5. Bana tıklayın düğmesine tıklayın. Olay işleyicisi button1_Click barındırılan Top denetimde ve Left özelliklerini ayarlar. Bu, barındırılan denetimin öğesi içinde yeniden konumlandırılmasına WindowsFormsHost neden olur. Konak aynı ekran alanını korur, ancak barındırılan denetim kırpılır. Bunun yerine, barındırılan denetim her zaman öğesini doldurmalıdır WindowsFormsHost .

Z Düzeni Sınırlamalarını Anlama

Görünür WindowsFormsHost öğeler her zaman diğer WPF öğelerinin üzerine çizilir ve z düzeninden etkilenmez. Bu z sırası davranışını görmek için aşağıdakileri yapın:

  1. Aşağıdaki XAML'yi Grid öğesine 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>
    
  2. Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. WindowsFormsHost öğesi etiket öğesinin üzerine boyanmış.

Takma

WindowsFormsHost öğesi WPF yerleştirmeyi destekler. Barındırılan Dock denetimi bir DockPanel öğeye yerleştirmesi için ekli özelliği ayarlayın.

Barındırılan denetimi takmak için şu adımları izleyin:

  1. Aşağıdaki XAML'yi Grid öğesine 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>
    
  2. Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. WindowsFormsHost öğesi, öğenin sağ tarafına DockPanel yerleştirilmiştir.

Görünürlüğü Ayarlama

Windows Forms denetiminizi görünmez yapabilir veya öğesinde VisibilityWindowsFormsHost özelliğini ayarlayarak daraltabilirsiniz. Bir denetim görünmez olduğunda görüntülenmez, ancak düzen alanını kaplar. Denetim daraltıldığında görüntülenmez ve düzen alanı kaplamaz.

Barındırılan denetimin görünürlüğünü ayarlamak için şu adımları izleyin:

  1. Aşağıdaki XAML'yi Grid öğesine 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>
    
  2. MainWindow.xaml.vb veya MainWindow.xaml.cs iç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 Sub
    
  3. Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın.

  4. Öğeyi görünmez yapmak için WindowsFormsHost Tıklayın düğmesine tıklayın.

  5. Öğeyi düzenden tamamen gizlemek WindowsFormsHost için Daraltmak için tıklayın düğmesine tıklayın. Windows Forms denetimi daraltıldığında, çevresindeki öğeler yer kaplamak için yeniden düzenlenir.

Esnetmeyen bir denetimi barındırma

Bazı Windows Forms denetimleri sabit bir boyuta sahiptir ve düzendeki kullanılabilir alanı doldurmak için esnetilmemiştir. Örneğin, MonthCalendar denetim sabit bir alanda bir ay görüntüler.

Esnetmeyen bir denetimi barındırmak için şu adımları izleyin:

  1. Aşağıdaki XAML'yi Grid öğesine 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>
    
  2. Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. WindowsFormsHost öğesi kılavuz satırında ortalanır, ancak kullanılabilir alanı doldurmak için uzatılmaz. Pencere yeterince büyükse, barındırılan MonthCalendar denetim tarafından iki veya daha fazla ay görüntülendiğini görebilirsiniz, ancak bunlar satırda ortalanır. WPF düzen altyapısı, kullanılabilir alanı dolduracak şekilde boyutlandırılamayan öğeleri ortalar.

Ölçeklendirme

WPF öğelerinin aksine, çoğu Windows Forms denetimi sürekli olarak ölçeklenebilir değildir. Özel ölçeklendirme sağlamak için yöntemini geçersiz kılarsınız WindowsFormsHost.ScaleChild .

Barındırılan denetimi varsayılan davranışı kullanarak ölçeklendirmek için şu adımları izleyin:

  1. Aşağıdaki XAML'yi Grid öğesine 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>
    
  2. 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üne göre ölçeklendirilir. Ancak barındırılan denetimin yazı tipi ölçeklendirilmemiş.

Dönen

WPF öğelerinin aksine, Windows Forms denetimleri döndürmeyi desteklemez. Döndürme WindowsFormsHost dönüşümü uygulandığında öğesi diğer WPF öğeleriyle birlikte döndürülmüyor. 180 derece dışındaki döndürme değerleri olayı tetikler LayoutError .

Karma uygulamada döndürmenin etkisini görmek için şu adımları izleyin:

  1. Aşağıdaki XAML'yi Grid öğesine 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>
    
  2. Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. Barındırılan denetim döndürülmedi, ancak çevresindeki öğeler 180 derecelik bir açıyla döndürülür. Öğeleri görmek için pencereyi yeniden boyutlandırmanız gerekebilir.

Doldurma ve Kenar Boşluklarını Ayarlama

WPF düzenindeki doldurma ve kenar boşlukları, Windows Forms'daki doldurma ve kenar boşluklarına benzer. öğesinde Padding ve Margin özelliklerini ayarlamanız yeterlidir WindowsFormsHost .

Barındırılan denetim için doldurma ve kenar boşluklarını ayarlamak için şu adımları izleyin:

  1. Aşağıdaki XAML'yi Grid öğesine 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>
    
  2. 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, Windows Forms'da uygulandıkları şekilde uygulanır.

Dinamik Düzen Kapsayıcılarını Kullanma

Windows Forms iki dinamik düzen kapsayıcısı FlowLayoutPanel sağlar ve TableLayoutPanel. Bu kapsayıcıları WPF düzenlerinde de kullanabilirsiniz.

Dinamik düzen kapsayıcısı kullanmak için şu adımları izleyin:

  1. Aşağıdaki XAML'yi Grid öğesine kopyalayın:

    <!-- Flow layout. -->
    <DockPanel Grid.Row="4" Grid.Column="2">
      <WindowsFormsHost Name="flowLayoutHost" Background="Yellow">
        <wf:FlowLayoutPanel/>
      </WindowsFormsHost>
    </DockPanel>
    
  2. MainWindow.xaml.vb veya MainWindow.xaml.cs iç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 Sub
    
  3. Oluşturucuda yöntemine InitializeFlowLayoutPanel bir çağrı ekleyin:

    public MainWindow()
    {
        InitializeComponent();
    
        this.InitializeFlowLayoutPanel();
    }
    
    Public Sub New()
        InitializeComponent()
    
        Me.InitializeFlowLayoutPanel()
    
    End Sub
    
  4. Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. WindowsFormsHost öğesi öğesini doldurur DockPanelve FlowLayoutPanel alt denetimlerini varsayılan FlowDirectioniçinde düzenler.

Ayrıca bkz.