如何计算WPF中客户区的偏移量?

时间:2010-01-08 09:03:34

标签: c# wpf user-interface

我想在父窗口客户区右上角放置一个模态对话框(进度窗口)。

此代码会将其放在非客户区的角落,但如何计算客户区的偏移?

this.Owner=owner;
this.Left=owner.Left+owner.ActualWidth-Width;
this.Top=owner.Top;

编辑:

我发现这个“解决方案”适用于普通的窗口:

this.Left=owner.Left+owner.ActualWidth-Width-SystemParameters.ResizeFrameVerticalBorderWidth;
this.Top=owner.Top+SystemParameters.ResizeFrameHorizontalBorderHeight+SystemParameters.WindowCaptionHeight;

但是对于具有自定义边框的窗口,这将失败。

编辑:

无论系统DPI设置如何,代码都应该有效(例如120而不是96)。

1 个答案:

答案 0 :(得分:4)

只要您的窗口内容是UIElement的子类(通常就是这种情况),您只需检查内容所涵盖的区域:

Matrix scaling = PresentationSource.FromVisual(windowContent)
                   .CompositionTarget.TransformFromDevice;

UIElement windowContent = owner.Content as UIElement;

Point upperRightRelativeToContent = new Point(
  windowContent.RenderSize.Width + owner.Margin.Right,
  -owner.Margin.Top);

Point upperRightRelativeToScreen =
  windowContent.PointToScreen(upperRightRelativeToContent);

Point upperRightScaled =
  scaling.Transform(upperRightRelativeToScreen);

this.Owner = owner;
this.Left = upperRightScaled.X - this.Width;
this.Top = upperRightScaled.Y;

如果你有一个奇怪的情况,你想让它适用于任意Window.Content,你必须使用VisualTreeHelper.GetChildCount()VisualTreeHelper.GetChild()搜索窗口的可视树,直到你来到其ContentPresenter属性与Content匹配的Window,并在上面的代码中将其第一个可视子项用作“windowContent”。