WPF矩形行程厚度会影响位置吗?

时间:2014-08-05 08:15:04

标签: c# wpf

我需要快速建议绘制矩形以进行打印。如果我定义

new drawingContext.DrawRectangle(new SolidColorBrush(Colors.Brown), 
                                 new Pen(new SolidColorBrush(Colors.Black), 3), 
                                 new Rect(new Point (1, 1), new Size(Width, Height))) 

是矩形的左上角最左边(1,1),还是因为行程厚度而存在偏移量?

我已经尝试了一些变化来弄明白,但总是得到不同的结果,并且无法在那里找到模式。

编辑:

protected override void OnRender(DrawingContext drawingContext)
    {
        Point start = new Point(1.5, 1.5);
        drawingContext.DrawRectangle(new SolidColorBrush(Colors.Brown), new Pen(new SolidColorBrush(Colors.Black), 3), new Rect(start, new Size(Width-2.5, Height-2.5)));

        base.OnRender(drawingContext);
    }

我试过了,假设矩形的参考点位于笔划的中间,厚度为3。这似乎是正确的,至少在矩形的左侧和上侧。我也确定了一个边距,厚度为1.

宽度和高度对应于printableWidth和printableHeight。因此我从(1.5,1.5)到(宽度-2.5,高度-2.5)。 1为边距,1.5为中风。但是看看印刷品,矩形不适合右侧和底部。

4 个答案:

答案 0 :(得分:1)

简单地测试你的假设很容易......或许比在这里提出一个问题更快:

<Grid Height="230">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Rectangle Grid.RowSpan="4" Grid.Column="0" Fill="Black" Stroke="Black" StrokeThickness="1" Width="1" Height="230" Margin="5,0" HorizontalAlignment="Right" />
    <Rectangle Grid.Row="0" Grid.Column="1" Fill="White" Stroke="Black" StrokeThickness="1" Width="200" Height="50" />
    <Rectangle Grid.Row="1" Grid.Column="1" Fill="White" Stroke="Black" StrokeThickness="5" Width="200" Height="50" />
    <Rectangle Grid.Row="2" Grid.Column="1" Fill="White" Stroke="Black" StrokeThickness="10" Width="200" Height="50" />
    <Rectangle Grid.Row="3" Grid.Column="1" Fill="White" Stroke="Black" StrokeThickness="15" Width="200" Height="50" />
    <Rectangle Grid.RowSpan="4" Grid.Column="2" Fill="Black" Stroke="Black" StrokeThickness="1" Width="1" Height="230" Margin="5,0" HorizontalAlignment="Left" />
</Grid>

enter image description here

在这里,您可以看到不同的StrokeThickness值对Rectangle s的大小或位置没有任何影响。

答案 1 :(得分:0)

据我所知,控件占用的总空间受其托管UIElement的约束,除非您专门设置,否则无法在逻辑上超出这些边界。 ClipToBounds设置将直观地截断超出这些边界的任何内容。

或者您正在与Adorners合作。

答案 2 :(得分:0)

要自己测试,请在同一位置绘制两个带有不同颜色边框的矩形。

new drawingContext.DrawRectangle(new SolidColorBrush(Colors.Brown), 
                             new Pen(new SolidColorBrush(Colors.Red), 6),
                             new Rect(new Point (1, 1), new Size(Width, Height)));
// Note: second rectangle should have a *smaller* stroke thickness
new drawingContext.DrawRectangle(new SolidColorBrush(Colors.Brown), 
                             new Pen(new SolidColorBrush(Colors.Black), 3), 
                             new Rect(new Point (1, 1), new Size(Width, Height)));

如果画笔宽度影响矩形的位置,您将看到第二个矩形边缘周围的红色边框。没有边界,没有效果。

答案 3 :(得分:0)

在这里扩展答案,不要混淆StrokeThicknessBorderThicknessFrameworkElement继承层次结构具有不同的分支

  • Shape,其中包括与...讨论的UI就绪Rectangle类。
  • 具有Decorator属性的
  • Child框架元素,其中框架的厚度例如Border ...
  • Control,通常具有Content的一些概念,其中一些也可能模仿或暴露来自BorderThickness的自己的BorderBrush / Decorator属性/ li>

出于当前问题的目的,仅在以下情况下修改StrokeThickness上的BorderThicknessFrameworkElement才能影响其位置:

  1. 元素本身 首先确定更改会影响其自身的总体大小。如果更改不会影响其实际大小,则其位置无法移动。但是,如果元素的DesiredSize属性确实发生了变化,那么该变化将被元素的布局父级注意到,并给出第二个条件...
  2. ...以及 ,如果由于DesiredSize的更改, 布局父级决定移动元素

因此,提出的问题的正确答案是“可能”,因为它取决于所讨论的特定元素(在OP中为Rectangle)和布局父级。

对于OP的特定示例,在Width上显式设置HeightRectangle属性将被解释为请求最终的整体大小,这将包括其笔触的整个外部范围。此模式的效果是始终减小内部区域,因为笔划将始终取自或“压入”整体尺寸的内部内部,因为对于最后的{{1 }}同意DesiredSize

此外,我相信Width/Height绝不会“增长”其大小,以满足满足整个形状内部的过胖Rectangle的目的。因此,由于StrokeThickness永远无法满足条件(1.),因此另一个条件是没有意义的,因此在<{> 1上 更改Rectangle }}永远不会使其移动

我修改了@Sheridan提供的代码,以比较StrokeThickness派生元素Rectangle的使用-该元素不包含任何布局子元素(左列) -使用Shape派生的元素Rectangle,其中包含Decorator作为子元素,报告内部可用大小(右列)。您可以看到,随着Border的更改,TextBlock本身的StrokeThickness并没有变化,但是ActualWidth/ActualHeight 包含在内部的情况并非如此 Rectangle元素。

enter image description here

这是实验代码,以防万一有人想进一步使用它:

TextBlock


Border