繁体   English   中英

在 WPF 中,如何在 WindowsFormsHost 上画一条线?

[英]In WPF how can you draw a line over a WindowsFormsHost?

这是我的 XAML

<Grid
    Name="grid">
    <TextBlock
        Text="Some Label" />
    <WindowsFormsHost
        Name="winFormsHost">

    </WindowsFormsHost>
</Grid>

在加载表单时,我执行以下方法

protected void OnLoad(object sender, RoutedEventArgs e)
{
    // Create a line on the fly
    Line line = new Line();

    line.Stroke = Brushes.Red;
    line.StrokeThickness = 17;

    line.X1 = 50;
    line.Y1 = 50;

    line.X2 = 250;
    line.Y2 = 50;

    this.grid.Children.Add(line);

    System.Windows.Forms.TextBox oldSchoolTextbox = new System.Windows.Forms.TextBox();
    oldSchoolTextbox.Text = "A bunch of Random Text will follow.  ";
    oldSchoolTextbox.WordWrap = true;
    oldSchoolTextbox.Width = 300;

    for (int i = 0; i < 250; i++)
    {
        oldSchoolTextbox.Text += "abc ";

        if (i % 10 == 0)
        {
            oldSchoolTextbox.Text += Environment.NewLine;
        }
    }

    this.winFormsHost.Child = oldSchoolTextbox;
}

仅当我注释掉以下行时才会绘制该行。

this.winFormsHost.Child = oldSchoolTextbox;

如何在 WindowsFormsHost 控件上画一条线?

微软称之为“领空”的东西可以防止这种情况发生,至少是很容易。 这是描述 airspace 的 WPF Interop 页面 [它具有 DX 焦点,但同样适用于 WindowsFormsHost,正如所述。]

WindowsFormsHost(当它有一个孩子时)创建一个单独的 HWND,这会阻止 WPF 呈现上下文显示在该矩形中。

解决此问题的最佳选择需要 .NET 3.5sp1(至少可以可靠地工作)。 您可以通过创建一个完全独立的 100% 透明背景 window 并将其放置在您的 windows forms 主机控件上来解决这个问题。 然后你画进去,它就会正确显示。

这有点老套的感觉,但它确实有效。

我遇到了同样的问题,在全面搜索之后,最终还是在 WindowsFormsHost 上使用了透明的“覆盖层”window。 为了使您的主 window 与覆盖 window 保持同步,您需要处理以下事件:

MainWindow 的 LocationChanged 事件和 WindowsFormsHost 元素的 LayoutUpdated 事件。 这两个事件处理程序都应调用 function,将透明叠加层 window 移动到 WindowsFormsHost window(下例中的 SyncOverlayPosition())之上。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
   this.LocationChanged += new EventHandler(MainWindow_LocationChanged);
   _windowsFormsHost.LayoutUpdated += new EventHandler(_windowsFormsHost_LayoutUpdated);
}

void MainWindow_LocationChanged(object sender, EventArgs e)
{
   SyncOverlayPosition();
}

void _windowsFormsHost_LayoutUpdated(object sender, EventArgs e)
{
   SyncOverlayPosition();
}

void SyncOverlayPosition()
{
   Point hostTopLeft = _windowsFormsHost.PointToScreen(new Point(0, 0));    

   _overlayWindow.Left = hostTopLeft.X;
   _overlayWindow.Top = hostTopLeft.Y;
   _overlayWindow.Width = _windowsFormsHost.ActualWidth;
   _overlayWindow.Height = _windowsFormsHost.ActualHeight;
}

接受的答案确实有效。 然而,唯一的问题是透明的 window 会显示在我的主 window 上。我还必须连接到移动以确保一切保持同步。

我做了一些与透明 window 略有不同的事情。这在我的案例中有效,但可能并不总是有效。

我创建了一个 Windows 表单用户控件。 我将文本框和线条图放在 windows 表单用户控件上。 这使我能够在它上面绘制并使用 WindowsFormsHost 在 WPF 应用程序中显示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM