Размер WPF WindowsFormsHost

Я хотел обернуть элемент управления Windows Forms в wpf UserControl

<UserControl x:Class="MVVMLibrary.ReportViewer"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ws="clr-namespace:Microsoft.Reporting.WinForms;assembly=Microsoft.ReportViewer.WinForms"
    Height="Auto" Width="Auto">
    <Grid>
        <WindowsFormsHost Name="Host">
            <ws:ReportViewer/>
        </WindowsFormsHost>
    </Grid>
</UserControl>

Обратите внимание, что высота и ширина установлены автоматически.

Когда он у меня в стеке или в элементе управления сеткой, он устанавливает свою высоту на 0 и в основном исчезает. Затем пользователю требуется изменить размер окна (которое уменьшилось, потому что пользовательский элемент управления сказал, что мне не нужно пространство, спасибо). Когда пользователь изменяет размер, он растягивается до указанного пользователем.

Итак, мой вопрос: что я сделал не так? Как сделать так, чтобы мой пользовательский элемент управления занимал все доступное пространство вместо того, чтобы его запрашивать?


person Jose    schedule 10.06.2009    source источник


Ответы (5)


Я найду ответ получше.

Используйте dockPanel с LastChildFill = true, а затем поместите внутри WindowsFormsHost с горизонтальным и вертикальным выравниванием по Strech, и, конечно же, элемент управления WindowsForms должен заполниться.

<DockPanel LastChildFill="true">
    <WindowsFormsHost HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <Panel Dock=Fill />
    </WindowsFormsHost>
</DockPanel>

Наслаждаться',

person ykatchou    schedule 21.09.2010

Некоторые исправления: в DockPanel по умолчанию включен LastChildFill, а для горизонтального и вертикального выравнивания также автоматически устанавливается растягивание.

Итак, краткий ответ: используйте DockPanel

<DockPanel>
     <WindowsFormsHost>
     </WindowsFormsHost>
</DockPanel>
person DLeh    schedule 12.05.2014

Та же проблема и здесь. Что я сделал, так это привязал размеры элемента управления WindowsForm (который должен быть встроен) к размерам (ширине и высоте) родительского хоста (то есть WindowsFormHost), см. Приведенный ниже код. Это делается после загрузки формы Windows:

 private void Window_Loaded(object sender, RoutedEventArgs e)
 {
    UserWinFormControl.Height = UserWinFormControl.Parent.Height;
    UserWinFormControl.Width = UserWinFormControl.Parent.Width;

 }   

Где UserWinFormControl - это элемент управления, который должен быть встроен / размещен на WindowsFormHost. В Xaml напишите:

<Window x:Class="myAppWpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:WinForms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        Title="MyApp" 
        Height="737" 
        Width="1024"
        WindowStartupLocation="CenterScreen" 
        Loaded="Window_Loaded">
        <......>
        <DockPanel LastChildFill="true">
                        <WindowsFormsHost Name="windowsFormsHost1"DockPanel.Dock="Top" 
                                          Background="Yellow"         
                                          HorizontalAlignment="Stretch"             
                                          VerticalAlignment="Stretch" >
                         </WindowsFormsHost>
        </DockPanel>
        </....>
</Window>

Все работает нормально, при изменении размера приложения не мерцает.

person alexander lilov    schedule 18.01.2012
comment
Спасибо - Каким-то образом предоставление элементу управления цвета фона резко уменьшило мерцание элементов управления. - person Justin; 29.05.2012

У меня была такая же проблема. Я исправил это, изменив размер элемента управления внутри WindowsFormsHost во время выполнения.

В моем случае я использовал StackPanel для размещения элемента управления, а во время выполнения я установил высоту и ширину элемента управления внутри моего WindowsFormsHost равными высоте и ширине Stackpanel. Вы хотите использовать свойства ActualHieight и ActualWidth.

К сожалению, мне пришлось подключаться к событию изменения размера, изменяющему его каждый раз, когда размер окна менялся.

person David Basarab    schedule 19.06.2009

У меня была какая-то похожая проблема. Мне удалось исправить свою проблему, удалив минимальные и максимальные параметры высоты и ширины из формы winForm.

После этого я использовал DockPanel, как предложил ykatchou. У меня все еще есть проблемы с DPI, но я не думаю, что они будут иметь большое значение. Это некрасиво, но работает

person thepaulpage    schedule 17.08.2011