我想在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占用所有可用空间而不是不要求任何空间?
答案 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有关的问题,但我认为它们并不重要。这很难看,但它正在运作