在WPF中绘制样式化的线条

6

如何使用WPF几何图形制定简单的线条样式,以使点之间有连线?我知道可以制作这种类型的线条:

-- -- --- --

但我想用任何简单的几何图形(例如:'^'符号)来画直线。因此,我想要类似下面这样的东西(线条不一定是水平或垂直的):

^^^^^^^^^^^^^^^^^    
*****************

注意: 我不想使用一些字符来制造行。我想使用任意的几何图形(例如:初始形状,三角形或任何其他形状)来实现。换句话说,我想在两个点之间沿着线性路径重复某些几何图形。因此,这些简单的几何图形可能会被旋转以跟随该线 ...


我需要的输出应该是几何类型,例如:StreamGeometry - Hossein Narimani Rad
你尝试过使用自定义画刷来设置 Stroke 属性的 System.Windows.Shapes.Line 吗? - Simon Mourier
谢谢,这是一个不错的链接,但对于一般线条(具有任意斜率),似乎必须以某种方式旋转刷子!否则它将无法绘制所需的形状。 - Hossein Narimani Rad
1
旋转画笔只需计算您想要用画笔绘制的线条的角度(以度为单位),例如 double r = 180 * Math.Atan2(p2.Y - p1.Y, p2.X - p1.X) / Math.PI,然后将您的画笔的 Transform 属性设置为 new RotateTransform(-r)(您需要使用负值的角度,因为 RotateTransform 顺时针旋转)。如果您还需要在画笔上进行其他变换,请改用 TransformGroup - Grx70
1
你尝试过使用Image Brush(Tile Brush)吗?http://msdn.microsoft.com/en-us/library/aa970682.aspx,同时也可以查看同一链接中的其他刷子教程。 - Akash Kava
显示剩余2条评论
2个回答

1
如果我理解正确,您想使用*^!作为一条线。而不是使用普通的实线、虚线、点线等等,您想使用实际字符?但您希望这些字符成为一个Geometry对象。
您可以尝试以下操作:
// Create a line of characters.
string lineString = "^^^^^^^^^^^^^^";

// Create Formatted Text, customize accordingly.
FormattedText formatText = new FormattedText(
     lineString, CultureInfo.GetCultureInfo("en-us"),
     FlowDirection.LeftToRight,
     new Typeface("Arial"), 32, Brushes.Black);

// Set the Width and Height.
formatText.MaxTextWidth = 200;
formatText.MaxTextHeight = 100;

// You can obviously add as many customization's and outputs of your choice.

现在我明白这不是你想要的,你希望上面提到的stringGeometry中起作用。为了实现这一点,你只需要执行以下操作:
// Build Geometry object to represent text.
Geometry lineGeometry = formatText.BuildGeometry(new System.Windows.Point(0, 0));

// Tailor Geometry object that represents our item.
Geometry hGeo = formatText.BuildHighlightGeometry(new System.Windows.Point(0, 0));

现在你已经建立了一个代表“^^^^^^^^”的Geometry对象。希望我理解得正确,不知道这是否解决了你的问题。

谢谢,但是如果我想在两个点(p1,p2)之间绘制自定义线条怎么办?此外,我不打算使用某些字符来制作线条。我希望能够使用任何自定义几何形状来制作线条。当然,这个几何形状可能类似于某些字符。 - Hossein Narimani Rad
这就是我的答案所做的事情:将formatText转换为几何形状。这不是你想要的吗?我现在有点困惑了,你能用不同的方式解释一下吗,这样我就可以更好地帮助你了吗? - Greg
一般来说,假设我有一个小几何图形(例如:星形),我想用这些星形(或任何其他形状)在任意两个点之间画线。 - Hossein Narimani Rad
好的,让我想一想。根据你的问题,我首先想到的是“相机投影”。创建一个跨越你的空间的投影平面。然后,你只需输入所选几何体的“几何形状”,并相应地对其进行建模。我会尝试想出一个解决方案。 - Greg
以下是我对你的问题最初的想法链接:http://msdn.microsoft.com/en-us/library/ms747437.aspx#cameras - Greg

1

我认为这是一个有趣的问题,但我无法在stackoverflow文本框中提供令人满意的答案,所以我在github上上传了一个解决方案:

https://github.com/mrange/CodeStack/tree/master/q14545675/LineGeometry

我不敢保证这是您问题的百分之百解决方案(首先,我并不完全了解您的所有要求),但如果您看一下它,也许可以改进和完善一些东西。
当然,如果我对您所寻找的内容完全错误,请谅解。

谢谢,我已经更新了代码以避免使用.Clone(可能很昂贵)和TransformGroups(不必要)。使用.DrawGeometry多次而不是构建单个缓存几何体可能会有性能改进。 - Just another metaprogrammer
现在使用单个缓存绘图而不是几何图形。生成过程应该更简单。 - Just another metaprogrammer
谢谢,我正在寻找其他解决方案(也许有更好的想法)。否则你可能赢得了 +50 :) - Hossein Narimani Rad
那么在你的意见中,什么是更好的想法呢? - Just another metaprogrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接