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

标签 c# .net wpf drawing 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 控件上画一条线?

最佳答案

Microsoft 称之为“领空”的东西可以防止这种情况发生,至少可以很容易地做到这一点。这是 WPF Interop page describing airspace . [它具有 DX 焦点,但同样适用于 WindowsFormsHost,正如所述。]

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

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

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

关于c# - 在 WPF 中,如何在 WindowsFormsHost 上画一条线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1007743/

相关文章:

c# - DataGrid 中的虚拟化面板

c# - listview.selectionchanged,我可以让它在我每次点击一个项目时触发吗?

c# - Com 初始化错误 0x80040154 加载 c# COM 对象与 c++ 程序

c# - 查找正则表达式中的最后一个匹配项

c# - 在 .Net 中编译为 native 代码是否会完全删除 MSIL?

wpf - 更改ViewModel中的属性,使模型无法序列化?

c# - 将使用数据库部署在 Windows Azure 上的 ASP.NET 网站

c# - 字符串变量 to = a textbox.text

c# - XML 文档 (2, 2) 中存在错误。这是什么意思?

wpf - 对重新托管的工作流程设计器隐藏参数