wpf在winform显示位置不对
时间: 2023-10-25 07:06:39 浏览: 89
WPF和WinForm集成MiniBlink49版本
当在Windows窗体中使用ElementHost控件显示WPF窗口时,有可能出现WPF窗口位置不正确的问题。这可能是由于Windows窗体和WPF窗口之间的坐标系不同所致。
为了解决这个问题,你可以在WPF窗口的Loaded事件中设置窗口的位置,使其与ElementHost控件对齐。以下是一个示例代码:
```
private void MyWpfWindow_Loaded(object sender, RoutedEventArgs e)
{
PresentationSource source = PresentationSource.FromVisual(this);
if (source != null)
{
Matrix m = source.CompositionTarget.TransformToDevice;
Point topLeft = m.Transform(new Point(0, 0));
HwndSource hwndSource = (HwndSource)HwndSource.FromVisual(this);
if (hwndSource != null)
{
double dpiX = hwndSource.CompositionTarget.TransformToDevice.M11;
double dpiY = hwndSource.CompositionTarget.TransformToDevice.M22;
Point location = new Point(this.Left * dpiX + topLeft.X, this.Top * dpiY + topLeft.Y);
Point targetLocation = PointToScreen(new Point(0, 0));
double offsetX = targetLocation.X - location.X;
double offsetY = targetLocation.Y - location.Y;
hwndSource.Handle.SetWindowPos(IntPtr.Zero, (int)(Left * dpiX + offsetX), (int)(Top * dpiY + offsetY), 0, 0, SWP.NOSIZE | SWP.NOZORDER);
}
}
}
```
在这个示例中,MyWpfWindow是你自己定义的WPF窗口类。在WPF窗口的Loaded事件中,使用PresentationSource和HwndSource获取WPF窗口的设备坐标和窗口句柄,并计算出WPF窗口与ElementHost控件之间的偏移量。然后,使用Windows API函数SetWindowPos将WPF窗口移动到正确的位置。
注意,由于WPF窗口和Windows窗体之间的坐标系不同,需要进行一些计算才能正确地将WPF窗口移动到ElementHost控件的位置。此外,使用Windows API函数SetWindowPos可能会影响WPF窗口的性能,因此需要谨慎使用。
阅读全文