我需要快速建议绘制矩形以进行打印。如果我定义
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为中风。但是看看印刷品,矩形不适合右侧和底部。
答案 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>
在这里,您可以看到不同的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)
在这里扩展答案,不要混淆StrokeThickness
和BorderThickness
。 FrameworkElement
继承层次结构具有不同的分支
Shape
,其中包括与...讨论的UI就绪Rectangle
类。Decorator
属性的Child
框架元素,其中框架的厚度例如Border
... Control
,通常具有Content
的一些概念,其中一些也可能模仿或暴露来自BorderThickness
的自己的BorderBrush
/ Decorator
属性/ li>
出于当前问题的目的,仅在以下情况下修改StrokeThickness
上的BorderThickness
或FrameworkElement
才能影响其位置:
DesiredSize
属性确实发生了变化,那么该变化将被元素的布局父级注意到,并给出第二个条件... DesiredSize
的更改, 布局父级决定移动元素 。因此,提出的问题的正确答案是“可能”,因为它取决于所讨论的特定元素(在OP中为Rectangle
)和布局父级。
对于OP的特定示例,在Width
上显式设置Height
和Rectangle
属性将被解释为请求最终的整体大小,这将包括其笔触的整个外部范围。此模式的效果是始终减小内部区域,因为笔划将始终取自或“压入”整体尺寸的内部内部,因为对于最后的{{1 }}同意DesiredSize
。
此外,我相信Width/Height
绝不会“增长”其大小,以满足满足整个形状内部的过胖Rectangle
的目的。因此,由于StrokeThickness
永远无法满足条件(1.),因此另一个条件是没有意义的,因此在<{> 1上 更改Rectangle
}}永远不会使其移动 。
我修改了@Sheridan提供的代码,以比较StrokeThickness
派生元素Rectangle
的使用-该元素不包含任何布局子元素(左列) -使用Shape
派生的元素Rectangle
,其中包含Decorator
作为子元素,报告内部可用大小(右列)。您可以看到,随着Border
的更改,TextBlock
本身的StrokeThickness
并没有变化,但是ActualWidth/ActualHeight
包含在内部的情况并非如此 Rectangle
元素。
这是实验代码,以防万一有人想进一步使用它:
TextBlock
Border