wpf怎么使用WindowsFormsHost
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wpf怎么使用WindowsFormsHost相关的知识,希望对你有一定的参考价值。
举个简单的例子
使用方法:1、首先,我们需要向项目中的引用(reference)中添加两个动态库dll,一个是.NET库中的System.Windows.Forms,另外一个是WindowsFormsIntegration;
2、添加完两个动态dll以后,就可以在控件库中找到WindowsFormsHost这个控件;
3、将这个控件放入窗体,放置完以后在xmal代码中会自动生成相应代码:
<Grid>
<WindowsFormsHost Height="100" HorizontalAlignment="Left" Margin="36,29,0,0" Name="windowsFormsHost1" VerticalAlignment="Top" Width="200" />
</Grid>
4、然后,需要在xmal的开始处添加两行代码 :
xmlns:WinFormHost="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
xmlns:WinFormControls="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
5、这样就可以在WindowsFormsHost下放置需要的Windows Form控件了。
<WindowsFormsHost Height="196" HorizontalAlignment="Left" Margin="104,65,0,0" Name="windowsFormsHost1" VerticalAlignment="Top" Width="286" >
<WinFormControls:Button Text="WinformButton" Width="150"/>
</WindowsFormsHost> 参考技术A WPF调用Winform控件时使用
可参见使用例子:http://jingyan.baidu.com/article/d5a880eb6f2a7d13f147cc0c.html本回答被提问者采纳 参考技术B 怎么解决?同求...这个问题已经困扰了我半年多的时间了,都没什么好的解决办法..
在 WPF WindowsFormsHost 中滚动 WinForms DataGridView
【中文标题】在 WPF WindowsFormsHost 中滚动 WinForms DataGridView【英文标题】:Scroll WinForms DataGridView in a WPF WindowsFormsHost 【发布时间】:2012-02-28 12:54:25 【问题描述】:我有一个 Scrollviewer,它包含一个带有 WindowsFormsHost 的框架。 WindowsFormsHost 包含一个 DataGridView(请不要问我为什么不使用 WPF DataGrid 控件执行此操作)。
因为 DataGridView 在使用 scrollviewer 滚动时会导致显示错误,所以我禁用了 scrollviewer 并在我的 DataGridView 上启用了滚动。
<Grid x:Name="LayoutRoot">
<WindowsFormsHost HorizontalAlignment="Stretch" Name="_windowsFormsHostGrid" VerticalAlignment="Stretch">
<Win.Grid:DataGridView x:Name="_buchungGrid" ScrollBars="Both" BorderStyle="None" BackgroundColor="#F7F8FA" CellFormatting="_gridBuchungen_CellFormatting" SelectionChanged="GridSelectionChanged" DoubleClick="_buchungInovaGrid_DoubleClick" AutoSize="True" AutoColumnWidthMode="Window" ZebraColor="LightGray" Anchor="Left" Dock="Fill" />
</WindowsFormsHost>
</Grid>
这似乎有效。只要我不调整窗口大小。当我调整窗口大小时(这将导致所有子元素调整大小,包括滚动查看器、框架和 WindowsFormsHost),我的 DataGridView 的滚动条消失了,我不再能够滚动我的网格。我可以调整到旧的窗口大小,但滚动条仍然隐藏。
知道为什么会发生这种情况以及如何解决吗?我也不确定它们为什么会消失,因为我只调整了一个像素的大小并且会发生这种情况。
【问题讨论】:
什么是 Win.Grid:DataGridView?它是您正在使用的某种自定义控件吗? 不。 Win.Grid 是我的 WinForms 程序集参考,DataGridView 是 WinForms DataGridView 控件。 【参考方案1】:似乎没有解决这个问题的方法。我最终使用了 WPF DataGrid 并通过我需要的功能对其进行了扩展。
WinForms 将一直绘制在所有其他元素的顶部。唯一的解决方案似乎是在它周围包裹一个窗口以固定滚动,但这会很难看。
【讨论】:
【参考方案2】:给定 WindowsFormsHost 内的 Forms.UserControl (myUserControl) 内的 Forms.DataGridView (dgv),我发现 DGV 的尺寸比 UC 大,因此滚动条不可见。 (如果 UC 位于 WinForm 中,滚动条会按预期显示;WFHost 内部的调整大小逻辑似乎存在问题。)
我能够在我的 UC 的 SizeChanged 处理程序中解决这个问题:
// VB code:
Public Class MyUserControl
...
Private Sub MyUserControl_SizeChanged(sender As Object, e As EventArgs) Handles MyBase.SizeChanged
' dgv.Size is much larger than it should be; not sure why.
' my dgv has controls above it, but extends all the way to bottom and right;
' if yours does not, then subtract more as needed.
dgv.Size = New Size(Me.Size.Width - dgv.Left, Me.Size.Height - dgv.Top)
End Sub
...
End Class
结果是 WinForms 绘图停留在它应该在的区域内;滚动是在 WinForms 中完成的。 (不使用 WPF 滚动查看器。)
用于 WPF 的 XAML:
...
xmlns:mywf="clr-namespace:MyWinFormAssembly;assembly=MyWinFormAssembly"
...
<WindowsFormsHost>
<mywf:MyUserControl />
</WindowsFormsHost>
【讨论】:
以上是关于wpf怎么使用WindowsFormsHost的主要内容,如果未能解决你的问题,请参考以下文章