动态数据显示 - WPF - 需要在画布上添加文本 - C#

11

我正在使用动态数据显示 WPF 图表。我需要在图表上绘制的曲线的每个点旁边显示一个标签。

具体功能如下:

  1. 每个曲线都有一个包含它的数据和描述(包括颜色、标记形状等)的对象。它还告诉我是否必须为该特定曲线显示标签。

  2. 还有一个选项,使用复选框可以隐藏/显示绘图中所有曲线上所有点的标签。

  3. 第三个选项是用户可以左键单击标记并在旁边看到标签。

之前,我通过为每个点添加 ElementMarkerPointGraph 的标签并设置标签的可见性来实现它。我知道这种方法会带来巨大的性能影响。

现在,我正在寻找一种解决方案,可以在我提供的位置直接向画布渲染文本。我也需要帮助从画布中删除文本。

有没有一种原生地向画布添加文本的方法?最有效的方法是什么?

编辑:我需要在绘图区缩放时移动文本。我已经知道当绘图区缩放时,我需要将文本移动到适当的位置。


很难没有代码。你如何显示曲线?我们能否有实际绘制曲线的XAML片段? - Kek
它使用Plotter2DExtensions类中的扩展方法。您可以在codeplex上查看D3源代码。无论如何,我已决定使用OnRender方法来实现这一点。谢谢![链接]http://dynamicdatadisplay.codeplex.com - Harsha
3个回答

23

我不确定这是否符合您的缩放目的,但以下代码可用于在画布中添加文本..我在谷歌搜索时从一个网站上得到了它。

private void Text(double x, double y, string text, Color color) 
{
    TextBlock textBlock = new TextBlock();
    textBlock.Text = text;
    textBlock.Foreground = new SolidColorBrush(color);
    Canvas.SetLeft(textBlock, x);
    Canvas.SetTop(textBlock, y);
    canvasObj.Children.Add(textBlock);
}

谢谢!但我已经知道如何添加文本块,但我想避免使用更多的控件。 :) - Harsha

6

好的。我无法在这里提供我的具体实现。但是我可以提供一些如何实现它的想法。

因此,创建一个简单的用户控件,该控件从Canvas派生。

class CustomCanvas : Canvas
{
    protected override void OnRender(DrawingContext dc)
    {
        FormattedText someFormattedText = new FormattedText(someText, System.Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight,
                someTypeFace, someFontSize, someColor);
        dc.DrawText(someFormattedText, new Point(15, 15));
    }
}

如果您不希望其进一步被子类化/重写,可以封闭类。

就是这样。您可以查看绘图上下文中提供的其他方法来执行其他操作。 :)


2

我自己想出来了。我将覆盖OnRender方法来处理这个问题。我可以使用绘图上下文来绘制文本。


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