WPF WindowsFormsHost大小调整

时间:2009-06-10 19:38:26

标签: wpf user-controls windowsformshost

我想在wpf UserControl中包装一个windows窗体控件

<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并基本消失时。然后,用户需要调整窗口的大小(由于用户控件说我不需要空间,因此缩小了窗口,谢谢)。当用户调整大小时,它会延伸到用户指定的任何内容。

所以我的问题是我做错了什么?如何让我的usercontrol占用所有可用空间而不是不要求任何空间?

5 个答案:

答案 0 :(得分:19)

我找到了更好的答案。

使用具有LastChildFill = true的dockPanel,然后将具有水平和垂直对齐的WindowsFormsHost放入Strech,当然WindowsForms控件必须填充。

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

享受”,

答案 1 :(得分:4)

同样的问题在这里。我所做的是将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>

在调整应用程序大小时,一切正常,没有闪烁。

答案 2 :(得分:4)

一些更正:DockPanel默认启用LastChildFill,水平和垂直对齐也会自动设置为拉伸。

所以简洁的答案是:使用DockPanel

<DockPanel>
     <WindowsFormsHost>
     </WindowsFormsHost>
</DockPanel>

答案 3 :(得分:3)

我有同样的问题。我修复它的方法是在运行时更改WindowsFormsHost内部控件的大小。

在我的例子中,我使用StackPanel来托管控件,在运行时我将WindowsFormsHost中控件的高度和宽度设置为Stackpanel的高度和宽度。您想使用ActualHieight和ActualWidth属性。

不幸的是,每次调整窗口大小时,我都必须连接到大小调整事件。

答案 4 :(得分:2)

我有类似的问题。我能够通过从winForm表单中删除最小和最大高度和宽度设置来解决我的问题。

之后我使用了像Ykatchou建议的DockPanel。我仍然有一些与DPI有关的问题,但我认为它们并不重要。这很难看,但它正在运作