我有一个WPF窗口,其中包含一个WindowsFormsHost元素.我需要在这个元素之上绘制东西,但是WindowsFormsHost它的本质意味着它始终位于绘图堆的顶部.由于我无法在WindowsFormsHost组件顶部的同一个WPF窗口中绘制,我可以在其上覆盖另一个窗口吗?
我已经初步尝试了这个,但是我遇到了一些问题:
1)我无法阻止主窗口和覆盖窗口之间的其他应用程序的窗口.
2)当我按Alt-Tab时,覆盖窗口出现在窗口列表中,这非常难看.
基本上我需要一个"子窗口"的概念,并且所有意图和目的的窗口都显示为另一个窗口的一部分.UserControls对我来说不起作用,因为它总是WindowsFormsHost会在它上面绘制.
有任何想法吗?
更新[2011年5月23日10:13]
谢谢你们的回答.
我已经尝试过这种ChildWindow方法,而且WindowsFormsHost元素仍然是最重要的.据我了解,只有一个真正的窗口可以在a上面绘制WindowsFormsHost,同一个窗口中的任何东西都会在下面WindowsFormsHost.
用的元素WindowsFormsHost仍然会在一个WinForms组件画,他们总是画在上面,这似乎非流通...
我想我正在寻找的是一种方法来停靠外部窗口作为主窗口的一部分.在Mac上,有一个真正的"儿童窗口"的概念,我正在寻找类似的东西.
除了安装Visual Studio 2012之外,我们现有的应用程序现在在尝试创建委托时崩溃了.
为什么我们在运行我们的应用程序时会遇到这个错误(不是在调试中运行...只是正常运行.exe ...没有重新编译,或者除了安装Visual Studio 2012之外还做了什么)?
Visual Studio 2012是否以某种方式更新.net 4.0 WindowsFormsIntegration?
有关如何绕过这个的任何建议?
'在匹配指定绑定约束的类型'MyWindowsFormsHost'上调用构造函数会引发异常.
内部例外:
无法绑定到目标方法,因为其签名或安全透明性与委托类型的签名或安全透明性不兼容
违规的班级和行:
internal class MyWindowsFormsHost : WindowsFormsHost
{
private delegate void NotifyChildFocus(ref Message m);
private readonly NotifyChildFocus childGotFocus;
public MyWindowsFormsHost()
{
//this line crashes now (and did not before VS2012 install)
this.childGotFocus = Delegate.CreateDelegate(typeof(NotifyChildFocus),
this, "NotifyActivateApp") as NotifyChildFocus;
}
}
Run Code Online (Sandbox Code Playgroud)
更新:发现WindowsFormsHost上不再存在NotifyActiveateApp方法.我不明白的是,使用visual studio 2012安装.net 4.5如何影响我现有的4.0应用程序.
更新:为了解决这个问题,我使用了反射来检查NotifyActivateApp方法是否存在.(如果它不存在,那么应用程序正在修补的.net版本中运行......我不必担心这个子焦点代码被编写修复的激活错误).
MethodInfo methodInfo = (typeof(WindowsFormsHost)).GetMethod("NotifyActivateApp", BindingFlags.NonPublic | BindingFlags.Instance);
if (methodInfo != null)
{
this.childGotFocus = Delegate.CreateDelegate(typeof(NotifyChildFocus), this, "NotifyActivateApp") as NotifyChildFocus;
} …Run Code Online (Sandbox Code Playgroud) 我希望它的行为就像你在应用程序上的某个地方点击一样.(折叠所有菜单,下拉等)
实际上,我正在尝试解决您在WPF应用程序中托管Windows窗体控件时遇到的与互操作性相关的焦点问题WindowsFormsHost:如果DevExpress的WPF菜单/弹出窗口打开并且您单击Windows窗体控件,则菜单/ popup不会自动被解雇.
现在我WindowsFormsHost在WPF区域中有很多Windows Forms控件以及很多DevExpress控件.为了轻松解决这个问题,我添加了一个消息过滤器来挂钩应用程序中的所有点击,然后我看看点击的控件是否是Windows窗体控件.然后我需要做一些事情来使DevExpress的所有WPF菜单等被解雇,如果它们是开放的.
GlobalMouseHandler globalClick = new GlobalMouseHandler();
System.Windows.Forms.Application.AddMessageFilter( globalClick );
Run Code Online (Sandbox Code Playgroud)
GlobalMouseHandler:
public class GlobalMouseHandler : System.Windows.Forms.IMessageFilter
{
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_RBUTTONDOWN = 0x204;
public bool PreFilterMessage( ref System.Windows.Forms.Message m )
{
if( m.Msg == WM_LBUTTONDOWN || m.Msg == WM_RBUTTONDOWN )
{
var c = System.Windows.Forms.Control.FromHandle( m.HWnd );
if( c != null )
// TODO: CLOSE ALL WPF MENUS ETC
// Didn't work: MainWindow.Instance.ARandomControl.Focus();
}
return false;
} …Run Code Online (Sandbox Code Playgroud) 在a WindowsFormsHost和选项卡导航中托管WinForms表单时遇到了问题.要解决我已经做了这个简单的例子:
Window(应用程序的起点)Form了两个TextBox上面的WinFormsWindowsFormsHost到它OnLoaded处理程序Textbox定位在WindowsFormsHost在OnLoaded我得到的处理程序中:
System.Windows.Forms.Form f = new WinFormsForm();
f.TopLevel = false;
f.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.windowsFormsHost1.Child = f;
Run Code Online (Sandbox Code Playgroud)
当我现在运行应用程序时:
TextBox在WindowsFormsHost,它获得焦点(OK)TextBox中WindowsFormsHost(OK)TextBox的WindowsFormsHost(不 ok了;应该已经离开WindowsFormsHost,并在WPF窗口底部给予重点的文本框)WindowsFormsHost),它得到焦点(确定)WindowsFormsHost- 因为它应该在结束后开始.所以这也没关系WindowsFormsHost(ok)WindowsFormsHost(去在WFH开始)(未确认)如果我只有一种类型的控件,我如何使焦点行为?在这种情况下,意味着WFH-1st-Textbox,WFH-2nd-Textbox,WPF-Textbox的Tab键顺序.
如何设置z-index windowsformhost,它们并不总是位于WPF元素的顶部?
我想在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>
Run Code Online (Sandbox Code Playgroud)
请注意,高度和宽度是自动的.
当我在stackpanel或网格控件中将它设置为0并基本上消失时.然后,用户需要调整窗口的大小(由于用户控件说我不需要空间,因此缩小了窗口,谢谢).当用户调整大小时,它会延伸到用户指定的任何内容.
所以我的问题是我做错了什么?如何让我的usercontrol占用所有可用空间而不是不要求任何空间?
我知道默认的WPF行为是渲染WPF控件然后在顶部呈现WinForms,但有没有办法在其上呈现WPF WindowsFormsHost?
编辑:我也发现了一个临时黑客.当wpf控件重叠时WindowsFormsHost,我改变了它的大小WindowsFormsHost(这只适用于有重叠的矩形对象,不适用于其他形状.)
我的WPF表单中有一个带有RichTextBox的WindowsFormHost,我已经为该WindowsFormHost提供了ScrollViewer,但它不能正常工作,WindowsFormHost不在ScrollViewer中...
我的XAML是......
<ScrollViewer Background="DarkOrange" VerticalScrollBarVisibility="Auto" Height="80" MaxHeight="85" Margin="11,243,12,218" Width="756">
<Canvas Height="100" Name="canvas1" Width="auto" >
<WindowsFormsHost ClipToBounds="True" Height="120" Width="715" Margin="10,5,0,0" Name="winHostTEst" Background="Gray">
<wf:RichTextBox BackColor="Cornsilk" Text="RichTextBox" x:Name="richTbTest" BorderStyle="None" Enabled="True" ForeColor="Black" Width="550" Multiline="True" ReadOnly="True" />
</WindowsFormsHost>
</Canvas>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
这里有两个链接解决这个问题,但我无法实现..请看看这些链接也解决我的问题..
链接是:
http://www.mycsharp.de/wbb2/thread.php?threadid=76625
提前致谢..
我是WPF的新手.新的我的意思是我在获得.net 3.5之后立即开始了它.我通常在Windows窗体中进行GUI开发,就像真棒ToolStripMenu一样.但是当我看到WPF菜单时,它太丑了,它让我想起了我的Win32 Api时代.有没有办法改变WPF菜单的样式,使其看起来像Windows窗体菜单?
我WindowsFormsHost在WPF中发现了一种非常奇怪的行为.我发现如果一个WPF控件没有WindowsFormsHost作为子控件,则会IsKeyboardFocusWithinChanged 正常触发 - 只要WPF控件获得或失去焦点IsKeyboardFocusWithin就会触发它,并且该变量按预期切换(true当控件获得焦点false时,失去焦点时) ).
但是,如果我WindowsFormHost在WPF中主持一个,那么片刻之后,IsKeyboardFocusWithinChangedWPF母控制和WindowsFormHost子控件都不再触发该事件.
我在MSDN文档中找不到或为什么这样,有什么原因?
这是我的代码:
MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525" IsKeyboardFocusWithinChanged="Window_IsKeyboardFocusWithinChanged">
<Grid Name="grid1">
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
host = new System.Windows.Forms.Integration.WindowsFormsHost();
var mtbDate = new System.Windows.Forms.MaskedTextBox("00/00/0000");
host.Child = mtbDate;
host.IsKeyboardFocusWithinChanged += Host_IsKeyboardFocusWithinChanged;
grid1.Children.Add(host);
}
private void Host_IsKeyboardFocusWithinChanged(object sender, DependencyPropertyChangedEventArgs e)
{
Console.WriteLine(host.IsKeyboardFocusWithin.ToString()+" blah"); …Run Code Online (Sandbox Code Playgroud) windowsformshost ×10
wpf ×9
.net ×4
c# ×4
winforms ×2
delegates ×1
devexpress ×1
interop ×1
scrollviewer ×1
tab-ordering ×1
topmost ×1
z-index ×1