标签: windowsformshost

我可以将WPF窗口覆盖在另一个窗口之上吗?

我有一个WPF窗口,其中包含一个WindowsFormsHost元素.我需要在这个元素之上绘制东西,但是WindowsFormsHost它的本质意味着它始终位于绘图堆的顶部.由于我无法在WindowsFormsHost组件顶部的同一个WPF窗口中绘制,我可以在其上覆盖另一个窗口吗?

我已经初步尝试了这个,但是我遇到了一些问题:

1)我无法阻止主窗口和覆盖窗口之间的其他应用程序的窗口.

2)当我按Alt-Tab时,覆盖窗口出现在窗口列表中,这非常难看.

基本上我需要一个"子窗口"的概念,并且所有意图和目的的窗口都显示为另一个窗口的一部分.UserControls对我来说不起作用,因为它总是WindowsFormsHost会在它上面绘制.

有任何想法吗?


更新[2011年5月23日10:13]

谢谢你们的回答.

我已经尝试过这种ChildWindow方法,而且WindowsFormsHost元素仍然是最重要的.据我了解,只有一个真正的窗口可以在a上面绘制WindowsFormsHost,同一个窗口中的任何东西都会在下面WindowsFormsHost.

用的元素WindowsFormsHost仍然会在一个WinForms组件画,他们总是画在上面,这似乎非流通...

我想我正在寻找的是一种方法来停靠外部窗口作为主窗口的一部分.在Mac上,有一个真正的"儿童窗口"的概念,我正在寻找类似的东西.

.net wpf interop windowsformshost

29
推荐指数
2
解决办法
2万
查看次数

无法绑定到目标方法,因为其签名或安全透明性与委托类型的签名或安全透明性不兼容

除了安装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)

c# delegates windowsformshost visual-studio-2012

16
推荐指数
0
解决办法
1万
查看次数

如何通过编程方式解除DevExpress的所有WPF菜单,弹出窗口等,以解决与WindowsFormsHost相关的问题?

我希望它的行为就像你在应用程序上的某个地方点击一样.(折叠所有菜单,下拉等)

实际上,我正在尝试解决您在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)

.net c# wpf devexpress windowsformshost

14
推荐指数
1
解决办法
884
查看次数

WPF托管WinForm,Tab导航问题

在a WindowsFormsHost和选项卡导航中托管WinForms表单时遇到了问题.要解决我已经做了这个简单的例子:

  • 创建WPF Window(应用程序的起点)
  • 创建Form了两个TextBox上面的WinForms
  • WPF窗口:添加WindowsFormsHost到它
  • WPF窗口:添加了OnLoaded处理程序
  • WPF窗口:添加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)

当我现在运行应用程序时:

  • 什么都没有集中(好)
  • 我点击第一个TextBoxWindowsFormsHost,它获得焦点(OK)
  • 我按Tab键,焦点转移到第二TextBoxWindowsFormsHost(OK)
  • 我再次按Tab键,焦点返回到第1 TextBoxWindowsFormsHost( ok了;应该已经离开WindowsFormsHost,并在WPF窗口底部给予重点的文本框)
  • 我点击wpf中的文本框(放在后面和下面WindowsFormsHost),它得到焦点(确定)
  • 我按Tab键,焦点转到第一个文本框WindowsFormsHost- 因为它应该在结束后开始.所以这也没关系
  • 我再次单击wpf文本框并按shift + tab,焦点转到第二个文本框WindowsFormsHost(ok)
  • 我按Tab键,焦点转移到文本框第一次在WindowsFormsHost(去在WFH开始)(确认)

如果我只有一种类型的控件,我如何使焦点行为?在这种情况下,意味着WFH-1st-Textbox,WFH-2nd-Textbox,WPF-Textbox的Tab键顺序.

.net wpf windowsformshost tab-ordering winforms

13
推荐指数
1
解决办法
5366
查看次数

WindowsFormsHost始终是WPF元素中最顶级的

如何设置z-index windowsformhost,它们并不总是位于WPF元素的顶部?

wpf z-index topmost windowsformshost

12
推荐指数
1
解决办法
1万
查看次数

WPF 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>
Run Code Online (Sandbox Code Playgroud)

请注意,高度和宽度是自动的.

当我在stackpanel或网格控件中将它设置为0并基本上消失时.然后,用户需要调整窗口的大小(由于用户控件说我不需要空间,因此缩小了窗口,谢谢).当用户调整大小时,它会延伸到用户指定的任何内容.

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

wpf user-controls windowsformshost

11
推荐指数
3
解决办法
2万
查看次数

在WindowsFormsHost之上渲染WPF控件

我知道默认的WPF行为是渲染WPF控件然后在顶部呈现WinForms,但有没有办法在其上呈现WPF WindowsFormsHost

编辑:我也发现了一个临时黑客.当wpf控件重叠时WindowsFormsHost,我改变了它的大小WindowsFormsHost(这只适用于有重叠的矩形对象,不适用于其他形状.)

wpf windowsformshost

10
推荐指数
4
解决办法
2万
查看次数

ScrollViewer无法在WPF WindowsFormHost中运行

在此输入图像描述我的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://blogs.msdn.com/b/ryanvog/archive/2009/01/20/clipping-legacy-content-hosted-inside-a-wpf-scrolling-region.aspx

http://www.mycsharp.de/wbb2/thread.php?threadid=76625

提前致谢..

wpf scrollviewer windowsformshost

10
推荐指数
2
解决办法
5280
查看次数

如何使WPF菜单看起来像Windows窗体ToolStripMenu?

我是WPF的新手.新的我的意思是我在获得.net 3.5之后立即开始了它.我通常在Windows窗体中进行GUI开发,就像真棒ToolStripMenu一样.但是当我看到WPF菜单时,它太丑了,它让我想起了我的Win32 Api时代.有没有办法改变WPF菜单的样式,使其看起来像Windows窗体菜单?

.net c# wpf windowsformshost winforms

9
推荐指数
1
解决办法
9391
查看次数

WindowsFormsHost的存在导致IsKeyboardFocusWithinChanged最多被触发两次而不是更多

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)

c# wpf windowsformshost

9
推荐指数
1
解决办法
861
查看次数