Пошаговое руководство. Упорядочение элементов управления Windows Forms в WPF
Статья
В этом пошаговом руководстве показано, как использовать функции макета WPF для упорядочивания элементов управления Windows Forms в гибридном приложении.
Задачи, показанные в этом пошаговом руководстве, включают:
Создание проекта.
Использование параметров макета по умолчанию.
Размер содержимого.
Использование абсолютной позиции.
Явное указание размера.
Задание свойств макета.
Понимание ограничений z-порядка.
Стыковка.
Настройка видимости.
Размещение элемента управления, который не растягивается.
<!-- Default layout. --><CanvasGrid.Row="0"Grid.Column="0"><WindowsFormsHostBackground="Yellow"><wf:ButtonText="Windows Forms control"FlatStyle="Flat"/></WindowsFormsHost></Canvas>
Нажмите клавишу F5, чтобы создать и запустить приложение. Элемент управления Windows Forms System.Windows.Forms.Button отображается в Canvas. Размещенный элемент управления масштабируется в зависимости от его содержимого, а элемент WindowsFormsHost имеет размер, чтобы вместить данный элемент управления.
Подгонка размера под содержимое
Элемент WindowsFormsHost обеспечивает, чтобы размещённый элемент управления был правильно размерен для отображения своего содержимого.
Чтобы подогнать размер по содержимому, выполните следующие действия.
<!-- Sizing to content. --><CanvasGrid.Row="1"Grid.Column="0"><WindowsFormsHostBackground="Orange"><wf:ButtonText="Windows Forms control with more content"FlatStyle="Flat"/></WindowsFormsHost></Canvas><CanvasGrid.Row="2"Grid.Column="0"><WindowsFormsHostFontSize="24"Background="Yellow"><wf:ButtonText="Windows Forms control"FlatStyle="Flat"/></WindowsFormsHost></Canvas>
Нажмите клавишу F5, чтобы создать и запустить приложение. Два новых элемента управления кнопками имеют размеры, позволяющие отображать более длинную текстовую строку и больший размер шрифта, а элементы WindowsFormsHost изменены для размещения этих элементов управления.
Использование абсолютной позиции
Для размещения элемента WindowsFormsHost в любом месте пользовательского интерфейса можно использовать абсолютную позицию.
Чтобы использовать абсолютную позицию, выполните следующие действия.
<!-- Absolute positioning. --><CanvasGrid.Row="3"Grid.Column="0"><WindowsFormsHostCanvas.Top="20"Canvas.Left="20"Background="Yellow"><wf:ButtonText="Windows Forms control with absolute positioning"FlatStyle="Flat"/></WindowsFormsHost></Canvas>
Нажмите клавишу F5, чтобы создать и запустить приложение. Элемент WindowsFormsHost расположен на расстоянии 20 пикселей от верхней границы ячейки сетки и 20 пикселей слева.
<!-- Explicit sizing. --><CanvasGrid.Row="4"Grid.Column="0"><WindowsFormsHostWidth="50"Height="70"Background="Yellow"><wf:ButtonText="Windows Forms control"FlatStyle="Flat"/></WindowsFormsHost></Canvas>
Нажмите клавишу F5, чтобы создать и запустить приложение. Элемент WindowsFormsHost имеет размер шириной 50 пикселей и высотой 70 пикселей, что меньше параметров макета по умолчанию. Содержимое элемента управления Windows Forms переупорядочено соответствующим образом.
Настройка свойств макета
Всегда задавайте свойства, связанные с макетом, на размещенном элементе управления, используя свойства элемента WindowsFormsHost. Установка свойств макета непосредственно в размещенном элементе управления даст непредвиденные результаты.
Настройка свойств, связанных с макетом, в хост-элементе управления в XAML не оказывает эффекта.
Чтобы просмотреть эффекты установки свойств в хостированном элементе управления, выполните следующие действия.
<!-- Setting hosted control properties directly. --><CanvasGrid.Row="0"Grid.Column="1"><WindowsFormsHostWidth="160"Height="50"Background="Yellow"><wf:ButtonName="button1"Click="button1_Click"Text="Click me"FlatStyle="Flat"BackColor="Green"/></WindowsFormsHost></Canvas>
В обозревателе решений дважды щелкните MainWindow.xaml.vb или MainWindow.xaml.cs, чтобы открыть его в редакторе кода.
Скопируйте следующий код в определение класса MainWindow:
C#
privatevoidbutton1_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
Нажмите клавишу F5, чтобы создать и запустить приложение.
Нажмите кнопку Нажмите кнопку. Обработчик событий button1_Click задает свойства Top и Left в размещенном элементе управления. Это приводит к перепозиции размещенного элемента управления в элементе WindowsFormsHost. Хост сохраняет ту же область экрана, но элемент управления обрезается при размещении. Вместо этого встроенный элемент управления всегда должен заполнять элемент WindowsFormsHost.
Общие сведения об ограничениях Z-order
Видимые элементы WindowsFormsHost всегда рисуются поверх других элементов WPF и не зависят от порядка z. Чтобы увидеть, как работает порядок сортировки по оси Z, сделайте следующее:
<!-- Docking a WindowsFormsHost element. --><DockPanelLastChildFill="false"Grid.Row="2"Grid.Column="1"><WindowsFormsHostDockPanel.Dock="Right"Canvas.Top="20"Canvas.Left="20"Background="Yellow"><wf:ButtonText="Windows Forms control"FlatStyle="Flat"/></WindowsFormsHost></DockPanel>
Нажмите клавишу F5, чтобы создать и запустить приложение. Элемент WindowsFormsHost закреплен справа от элемента DockPanel.
Настройка видимости
Вы можете сделать элемент управления Windows Forms невидимым или свернуть его, задав свойство Visibility в элементе WindowsFormsHost. Если элемент управления невидим, он не отображается, но занимает пространство макета. Если элемент управления свернут, он не отображается и не занимает пространство макета.
Чтобы задать видимость размещенного элемента управления, выполните следующие действия.
<!-- Setting Visibility to hidden and collapsed. --><StackPanelGrid.Row="3"Grid.Column="1"><ButtonName="button2"Click="button2_Click"Content="Click to make invisible"Background="OrangeRed"/><WindowsFormsHostName="host1"Background="Yellow"><wf:ButtonText="Windows Forms control"FlatStyle="Flat"/></WindowsFormsHost><ButtonName="button3"Click="button3_Click"Content="Click to collapse"Background="OrangeRed"/></StackPanel>
В MainWindow.xaml.vb или MainWindow.xaml.csскопируйте следующий код в определение класса:
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
Нажмите клавишу F5, чтобы создать и запустить приложение.
Нажмите кнопку Click, чтобы сделать невидимым кнопку, чтобы сделать элемент WindowsFormsHost невидимым.
Нажмите кнопку Click, чтобы свернуть кнопку, чтобы полностью скрыть элемент WindowsFormsHost от макета. Когда элемент управления Windows Forms свернут, окружающие элементы изменяют свое расположение, чтобы занять его место.
Размещение элемента управления, который не увеличивается в размерах
Некоторые элементы управления Windows Forms имеют фиксированный размер и не растягиваются, чтобы заполнить доступное пространство в макете. Например, элемент управления MonthCalendar отображает месяц в фиксированном пространстве.
Чтобы разместить элемент управления, который не растягивается, выполните следующие действия.
<!-- Hosting a control that does not stretch. --><!-- The MonthCalendar has a discrete size. --><StackPanelGrid.Row="4"Grid.Column="1"><LabelContent="A WPF element"Background="OrangeRed"/><WindowsFormsHostBackground="Yellow"><wf:MonthCalendar/></WindowsFormsHost><LabelContent="Another WPF element"Background="OrangeRed"/></StackPanel>
Нажмите клавишу F5, чтобы создать и запустить приложение. Элемент WindowsFormsHost центрируется в строке сетки, но он не растянут, чтобы заполнить доступное пространство. Если окно достаточно большое, может отобразиться два или более месяцев, отображаемых размещенным элементом управления MonthCalendar, но они находятся в центре строки. Подсистема макета WPF центрирует элементы, которые не могут быть растянуты для заполнения в доступного пространства.
Масштабирование
В отличие от элементов WPF, большинство элементов управления Windows Forms не являются постоянно масштабируемыми. Чтобы обеспечить пользовательское масштабирование, переопределите метод WindowsFormsHost.ScaleChild.
Чтобы масштабировать размещенный элемент управления с помощью поведения по умолчанию, выполните следующие действия:
Нажмите клавишу F5, чтобы создать и запустить приложение. Размещенный элемент управления и его окружающие элементы масштабируются по коэффициенту 0,5. Однако шрифт размещенного элемента управления не масштабируется.
Вращающийся
В отличие от элементов WPF элементы управления Windows Forms не поддерживают поворот. Элемент WindowsFormsHost не вращается вместе с другими элементами WPF при применении преобразования вращения. Любое значение поворота, отличное от 180 градусов, вызывает событие LayoutError.
Чтобы увидеть эффект поворота в гибридном приложении, выполните следующие действия.
Нажмите клавишу F5, чтобы создать и запустить приложение. Размещенный элемент управления не поворачивается, но его окружающие элементы поворачиваются углом в 180 градусов. Чтобы просмотреть элементы, может потребоваться изменить размер окна.
Настройка заполнения и полей
Внутренние и внешние отступы в макете WPF схожи с отступами в Windows Forms. Просто задайте свойства Padding и Margin в элементе WindowsFormsHost.
Чтобы задать отступы и поля для размещенного элемента управления, выполните следующие действия:
<!-- Padding. --><CanvasGrid.Row="2"Grid.Column="2"><WindowsFormsHostPadding="0, 20, 0, 0"Background="Yellow"><wf:ButtonText="Windows Forms control with padding"FlatStyle="Flat"/></WindowsFormsHost></Canvas>
XAML
<!-- Margin. --><CanvasGrid.Row="3"Grid.Column="2"><WindowsFormsHostMargin="20, 20, 0, 0"Background="Yellow"><wf:ButtonText="Windows Forms control with margin"FlatStyle="Flat"/></WindowsFormsHost></Canvas>
Нажмите клавишу F5, чтобы создать и запустить приложение. Параметры заполнения и отступов применяются к размещённым элементам управления Windows Forms аналогично их применению в Windows Forms.
Использование контейнеров динамического макета
Windows Forms предоставляет два контейнера динамического макета, FlowLayoutPanel и TableLayoutPanel. Эти контейнеры также можно использовать в макетах WPF.
Чтобы использовать контейнер динамического макета, выполните следующие действия.
В MainWindow.xaml.vb или MainWindow.xaml.csскопируйте следующий код в определение класса:
C#
privatevoidInitializeFlowLayoutPanel()
{
System.Windows.Forms.FlowLayoutPanel flp =
this.flowLayoutHost.Child as System.Windows.Forms.FlowLayoutPanel;
flp.WrapContents = true;
constint 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
Добавьте вызов метода InitializeFlowLayoutPanel в конструкторе:
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Отзыв о .NET Desktop feedback
.NET Desktop feedback — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Присоединитесь к серии встреч для создания масштабируемых решений искусственного интеллекта на основе реальных вариантов использования с другими разработчиками и экспертами.
Учебник. Размещение элементов управления Windows Forms в платформе Windows Presentation Foundation, где уже предоставлены множество элементов управления с широким набором функций.
Узнайте о сходствах и различиях типов элементов управления, предоставляемых элементами управления Windows Forms и эквивалентными элементами управления WPF.