我想在父窗口客户区右上角放置一个模态对话框(进度窗口)。
此代码会将其放在非客户区的角落,但如何计算客户区的偏移?
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)。
答案 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”。