代码之家  ›  专栏  ›  技术社区  ›  laktak

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

  •  2
  • laktak  · 技术社区  · 16 年前

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

    这段代码将把它放在非客户区的一角,但是如何计算到客户区的偏移量呢?

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

    编辑:

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

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

    编辑:

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

    1 回复  |  直到 16 年前
        1
  •  4
  •   Ray Burns    16 年前

    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