【问题标题】:Draw styled lines in WPF在 WPF 中绘制样式线
【发布时间】:2013-01-27 08:23:55
【问题描述】:

有没有办法在点之间画线,给定一个简单的几何作为线条样式,使用WPF几何?我知道可以制作这些线条:

-- -- --- --

但我想使用任何简单的几何图形(例如:'^' 符号)来制作线条。所以我想要的是这样的:(线不一定是水平或垂直的):

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

注意:我不想与某些字符划清界限。我想使用任意几何图形(例如:起始形状、三角形或任何其他几何图形)来实现。换句话说,我想沿着两点之间的线性路径重复一些几何图形。所以这些简单的几何图形可能会以某种方式旋转以跟随这条线......

【问题讨论】:

  • 我正在寻找的输出应该是几何类型。例如:StreamGeometry
  • 您是否尝试过将System.Windows.Shapes.LineStroke 属性的自定义画笔一起使用?
  • 我尝试了StrokeDashArray,但没有解决问题。我用行数据创建一个StreamGeometry,然后从它们创建一个Path。你能解释一下在这种情况下如何使用自定义画笔吗? (代码示例会有所帮助)
  • 要旋转画笔,只需计算要使用画笔绘制的线条的角度(以度为单位),例如double r = 180 * Math.Atan2(p2.Y - p1.Y, p2.X - p1.X) / Math.PI,然后将您的画笔的Transform 属性设置为new RotateTransform(-r)(您需要使用角度的负值,因为RotateTransform 顺时针旋转)。如果您还需要在画笔上进行其他变换,请改用 TransformGroup
  • 您是否尝试过使用图像画笔(平铺画笔)? msdn.microsoft.com/en-us/library/aa970682.aspx,也可以在同一个链接看看其他刷机方法。

标签: c# wpf geometry customization


【解决方案1】:

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

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

我并不是说这是 100% 解决您的问题(因为我不是您所有要求的 100%),但如果您看一看,也许可以改进和改进。

除非我对你正在寻找的东西大错特错。

【讨论】:

  • 谢谢,我确实更新了代码以避免 .Clone(可能很昂贵)和 TransformGroups(不必要的)。多次使用 .DrawGeometry 而不是构建单个缓存几何体可能会提高性能。
  • 现在使用单个缓存图形而不是几何图形。生成起来应该不太复杂。
  • 谢谢,我正在寻找其他解决方案(也许有更好的想法)。否则你可能会赢得 +50 :)
  • 那么您认为更好的主意是什么?
【解决方案2】:

如果我理解正确,您基本上想使用*^! 作为一行。与其使用普通的实线、虚线、虚线等线条,不如使用物理字符?但您希望这些字符成为 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.

现在我明白这不是你想要的,你希望上面的string 作用于Geometry。要做到这一点;你只需要这样做:

// 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)之间绘制自定义线怎么办。此外,我不会用某些字符来制作台词。我希望能够与任何自定义几何形状保持一致。当然这个几何形状可能和某些字符很相似
  • 这就是我的回答;将formatText 变成几何形状。这不是你的意思吗?我现在有点困惑,请您解释一下,以便我更好地为您提供帮助?
  • 一般想象我有一个小的几何形状(例如:星形),我想在任意两个任意点之间用这些起点(或任何其他形状)划线。
  • 好吧,让我想一想。根据您的问题,我想到了Camera Projection。创建一个跨越您的空间的投影平面。然后您只需输入您选择的Geometry 并相应地对其进行建模。我会尝试想出一个解决方案。
  • 我对您问题的初步想法的链接:msdn.microsoft.com/en-us/library/ms747437.aspx#cameras
猜你喜欢
  • 2011-01-07
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
相关资源
最近更新 更多