WPF WindowsForms Хостинг размеров - PullRequest
11 голосов
/ 10 июня 2009

Я хотел обернуть элемент управления Windows Form в 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 и в основном исчезает. Затем пользователь должен изменить размер окна (что сократилось, потому что пользовательский контроль сказал, что мне не нужно места, спасибо). Когда пользователь изменяет размер, он растягивается до того, что пользователь указывает.

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

Ответы [ 5 ]

19 голосов
/ 21 сентября 2010

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

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

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

Наслаждайтесь»,

4 голосов
/ 12 мая 2014

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

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

<DockPanel>
     <WindowsFormsHost>
     </WindowsFormsHost>
</DockPanel>
4 голосов
/ 18 января 2012

Та же проблема здесь. Что я сделал, так это связал измерения элемента управления 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>

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

3 голосов
/ 19 июня 2009

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

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

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

2 голосов
/ 18 августа 2011

У меня была какая-то похожая проблема. Я смог исправить мою проблему, удалив параметры min и max Height и Width из формы winForm.

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

...