C# 在WPF中,如何在WindowsFormsHost上画一条线?
这是我的XAMLC# 在WPF中,如何在WindowsFormsHost上画一条线?,c#,.net,wpf,drawing,windowsformshost,C#,.net,Wpf,Drawing,Windowsformshost,这是我的XAML <Grid Name="grid"> <TextBlock Text="Some Label" /> <WindowsFormsHost Name="winFormsHost"> </WindowsFormsHost> </Grid> 如何在WindowsFormsHost控件上划一条线?有一种微软称之为“空域”的东西可以防止这种情况发生,至少很容易做
<Grid
Name="grid">
<TextBlock
Text="Some Label" />
<WindowsFormsHost
Name="winFormsHost">
</WindowsFormsHost>
</Grid>
如何在WindowsFormsHost控件上划一条线?有一种微软称之为“空域”的东西可以防止这种情况发生,至少很容易做到。这是你的电话号码。[它有一个DX焦点,但同样的情况也适用于WindowsFormsHost。] WindowsFormsHost(当它有一个子项时)创建一个单独的HWND,以防止WPF呈现上下文显示在该矩形中 解决这个问题的最佳选择需要.NET3.5sp1(至少要可靠地工作)。您可以通过创建一个完全独立的、100%透明的背景窗口,并将其放置在windows窗体主机控件上来解决这个问题。然后将其绘制到其中,它将正确显示
这有点骇人的感觉,但它是有效的。微软称之为“空域”的东西可以防止这种情况发生,至少很容易做到。这是你的电话号码。[它有一个DX焦点,但同样的情况也适用于WindowsFormsHost。] WindowsFormsHost(当它有一个子项时)创建一个单独的HWND,以防止WPF呈现上下文显示在该矩形中 解决这个问题的最佳选择需要.NET3.5sp1(至少要可靠地工作)。您可以通过创建一个完全独立的、100%透明的背景窗口,并将其放置在windows窗体主机控件上来解决这个问题。然后将其绘制到其中,它将正确显示
这种感觉有点刺耳,但确实有效。公认的答案确实有效。然而,唯一的问题是,透明窗口将显示在我的主窗口上。我还必须融入运动,以确保一切保持同步 我做了一些与透明窗口略有不同的事情。这在我的情况下奏效,但可能并不总是奏效
我创建了一个Windows窗体用户控件。我将文本框和线条图放在windows窗体用户控件上。然后,这使我能够使用WindowsFormsHost绘制它并在WPF应用程序中显示。接受的答案确实有效。然而,唯一的问题是,透明窗口将显示在我的主窗口上。我还必须融入运动,以确保一切保持同步 我做了一些与透明窗口略有不同的事情。这在我的情况下奏效,但可能并不总是奏效
我创建了一个Windows窗体用户控件。我将文本框和线条图放在windows窗体用户控件上。这使我能够使用WindowsFormsHost绘制它并在WPF应用程序中显示。我也遇到了同样的问题,在搜索了所有内容后,也最终使用WindowsFormsHost顶部的透明“覆盖”窗口。要使主窗口与覆盖窗口保持同步,您需要处理以下事件: 主窗口的LocationChanged事件 和 WindowsFormsHost元素的LayoutUpdated事件。这两个事件处理程序都应该调用一个函数,将透明覆盖窗口移动到WindowsFormsHost窗口的顶部(以下示例中的SyncOverlayPosition())
我也遇到了同样的问题,在搜索了所有内容后,我最终使用了WindowsFormsHost顶部的透明“覆盖”窗口。要使主窗口与覆盖窗口保持同步,您需要处理以下事件: 主窗口的LocationChanged事件 和 WindowsFormsHost元素的LayoutUpdated事件。这两个事件处理程序都应该调用一个函数,将透明覆盖窗口移动到WindowsFormsHost窗口的顶部(以下示例中的SyncOverlayPosition())
请注意,在大多数情况下,此路径将强制同步到窗口位置-操纵onDrag onResize等。请注意,在大多数情况下,此路径将强制同步到窗口位置-操纵onDrag onResize等。。
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;
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;
}