17

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

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

4

5 回答 5

21

我找到了更好的答案。

使用 LastChildFill=true 的dockPanel,然后将水平和垂直对齐放置在WindowsFormsHost 内以拉伸,当然WindowsForms 控件必须填充。

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

享受',

于 2010-09-21T12:26:53.623 回答
6

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

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

<DockPanel>
     <WindowsFormsHost>
     </WindowsFormsHost>
</DockPanel>
于 2014-05-12T18:10:31.923 回答
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>

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

于 2012-01-18T10:55:38.167 回答
3

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

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

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

于 2009-06-19T14:47:22.803 回答
2

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

之后,我像 ykatchou 建议的那样使用了 DockPanel。我仍然对 DPI 有一些问题,但我认为它们并不重要。这很丑陋,但它正在工作

于 2011-08-17T21:25:52.453 回答