WPF 折线相对点值和用于绘制图形的拉伸
我正在尝试创建一个非常简单的图形组件,该组件由表示图形线的同一网格单元内的一系列折线组成。我的策略是查看集合中的所有点,确定最小值和最大值,然后相应地计算 0 到 1 之间的数字,并使用 Stretch="Fill" 拉伸每条折线以填充网格单元。我想要的效果是 0,.5 处的点垂直位于单元格的中心,但实际上折线会垂直拉伸以填充整个单元格,具体取决于最小和最大 Y 值。例如,如果 0.5 是我在折线中的最大值,0.7 是我在折线中的最小值,那么 0.5 将在单元格顶部透明,0.7 在底部透明,而不是 0.5 在中心和 0.7 7/10到底部。
这是一个简单的示例,其中包含两条多段线和 0 到 1 之间的计算点。您会注意到红色多段线直接位于蓝色多段线的顶部,即使红色 Y 值更大。红色折线看起来应该与蓝色相同,但在单元格中的方向略低。然而,它被拉伸以填充整个单元格,因此它直接位于蓝色的顶部。
<Window x:Class="Test.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="100" Width="300">
<Grid>
<Polyline
Stretch="Fill"
Stroke="Blue"
Points="0,0 0.2,0 0.2,0.363636363636364 0.4,0.363636363636364 0.4,0.636363636363636 0.6,0.636363636363636 0.6,0.0909090909090909 0.8,0.0909090909090909 0.8,0 1,0" />
<Polyline
Stretch="Fill"
Stroke="Red"
Points="0,0.363636363636364 0.2,0.363636363636364 0.2,0.727272727272727 0.4,0.727272727272727 0.4,1 0.6,1 0.6,0.454545454545455 0.8,0.454545454545455 0.8,0.363636363636364 1,0.363636363636364" />
</Grid>
我使用 0 到 1 值的原因是因为我希望网格单元的宽度和高度能够轻松更改,例如通过滑块或其他东西来调整图形的高度,或者将窗口拖得更宽以调整宽度。因此,我尝试使用这种拉伸策略来实现这一点,而不是计算不拉伸的像素值。
关于如何实现这一目标有什么建议吗?
谢谢。
I'm trying to create a pretty simple graphing component that consists of a series of Polylines within the same grid cell that represent graph lines. My strategy is to look at all the points in my set, determine the min and max, and then calculate a number between 0 to 1 accordingly and use Stretch="Fill" to stretch each Polyline to fill the grid cell. My desired effect would be that a point at 0,.5 would be vertically in the center of the cell, but in reality the Polyline gets stretched vertically to fill the entire cell depending on what the min and max Y value is. E.g. if .5 is my max and .7 is my min in the Polyline, then .5 will be clear at the top of the cell and .7 clear at the bottom, rather than .5 in the center and .7 7/10 to the bottom.
Here's a simple example with two Polylines and calculated points between 0 and 1. You'll notice the red Polyline is directly on top of the blue one, even though the red Y values are greater. The red Polyline should look the same as the blue, but be oriented slightly lower in the cell. However it's being stretched to fill the entire cell so it sits directly on top of the blue.
<Window x:Class="Test.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="100" Width="300">
<Grid>
<Polyline
Stretch="Fill"
Stroke="Blue"
Points="0,0 0.2,0 0.2,0.363636363636364 0.4,0.363636363636364 0.4,0.636363636363636 0.6,0.636363636363636 0.6,0.0909090909090909 0.8,0.0909090909090909 0.8,0 1,0" />
<Polyline
Stretch="Fill"
Stroke="Red"
Points="0,0.363636363636364 0.2,0.363636363636364 0.2,0.727272727272727 0.4,0.727272727272727 0.4,1 0.6,1 0.6,0.454545454545455 0.8,0.454545454545455 0.8,0.363636363636364 1,0.363636363636364" />
</Grid>
The reason I'm using 0 to 1 values is because I want the width and height of the grid cell to be easily changeable, e.g. via a slider or something to adjust the height of the graph, or dragging the window wider to adjust the width. So I tried to use this stretch strategy to achieve that instead of calculating pixel values w/out stretching.
Any advice on how to achieve this?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我遇到了类似的问题,因为我找不到缩放多个形状的简单方法。最终使用了带有多个
GeometryDrawing
的DrawingGroup
。所以它们一起扩展。这是使用这种方法的图表。看起来很笨重,但工作速度应该很快。另外,您很可能会从代码中填充线段:如果您不需要图形始终在 0 和 1 之间缩放,则可以删除第一个 RectangleGeometry。
I had similar problem because I couldn't find an easy way to scale multiple shapes. Ended up using
DrawingGroup
with multipleGeometryDrawing
inside. So they scale together. Here are your graphs with this approach. Looks bulky but should work fast. Plus you'll most likely populate line segments from code:You can remove first
RectangleGeometry
if you don't need graphs always scale between 0 and 1.我不久前遇到了这个问题。当时我找到了repka提出的解决方案,但对其不满意,因为它相对复杂并且没有我希望的那么高效。
我通过编写一组简单的 Viewbox 形状类解决了这个问题,这些类的工作方式与内置的
Path
、Line
、Polyline< /code> 和
Polygon
类,但它们可以轻松地按照您想要的方式进行拉伸。我的类是
ViewboxPath
、ViewboxLine
、ViewboxPolyline
和ViewboxPolygon
,它们的使用方式如下:如您所见,我的 Viewbox 形状类 就像普通形状一样使用(
Polyline
、Polygon
、Path
和Line
),除了额外的Viewbox
参数,以及它们默认为Stretch="Fill"
的事实。 Viewbox 参数指定在用于指定形状的坐标系中,应使用Fill
、Uniform
或UniformToFill
拉伸的几何图形区域> 设置,而不是使用Geometry.GetBounds
。这可以非常精确地控制拉伸,并且可以轻松地将单独的形状彼此精确对齐。
以下是我的 Viewbox 形状类 的实际代码,包括包含常见功能的抽象基类
ViewboxShape
:享受吧!
I ran into this problem a while back. At the time I found the solution repka proposed but was dissatisfied with it because it was relatively complex and not as efficient as I would have liked.
I solved the problem by coding a set of simple Viewbox shape classes that work exactly like the built in
Path
,Line
,Polyline
, andPolygon
classes except they make it easy to get stretching to work the way you want it.My classes are
ViewboxPath
,ViewboxLine
,ViewboxPolyline
andViewboxPolygon
, and they are used like this:As you can see, my Viewbox shape classes are used just like normal shapes (
Polyline
,Polygon
,Path
andLine
) except for the extraViewbox
parameter, and the fact that they default toStretch="Fill"
. The Viewbox parameter specifies, in the coordinate system used to specify the shape, the area of the geometry that should be stretched usingFill
,Uniform
orUniformToFill
settings, instead of usingGeometry.GetBounds
.This gives very precise control over the stretching and makes it easy to have separate shapes align accurately with one another.
Here is the actual code for my Viewbox shape classes, including the abstract base class
ViewboxShape
that contains common functionality:Enjoy!