0

我编写了一个 Windows 窗体 C# 应用程序,用于绘制诸如线条之类的矢量基元。椭圆等。我有一种方法可以更改所选图形的边框宽度。这是方法:

   public void SetBorderWidth(int border)
    {
        if (border < 0) 
            return;

        if ((SelectedItem != null) && (SelectedItem.isGroup == false)) 
        {              
            SelectedItem.BorderWidth = border;
        }

        if ((SelectedItem != null) && (SelectedItem.isGroup == true))
        {

            ChangeCascadeBorderWidth(SelectedItem, border);
        }

        foreach (Shape figure in ObjectsDrawn)
        {
            if (figure.Selected)
            {
                ObjectsDrawn[ObjectsDrawn.IndexOf(figure)].BorderWidth = border;
            }

            if (figure.isGroup)
            {
                ChangeCascadeBorderWidth(figure, border);
            }
        }            
    }

谁调用该方法:

    private void ChangeCascadeBorderWidth(Shape group, int width)
    {
        foreach (Shape item in ((Grouping)group).GroupedElements)
        {
            if (item.isGroup == true)
            {
                ChangeCascadeBorderWidth(item, width);
            }
            else
            {
                item.BorderWidth = width;
            }
        }
    }

如果该图是几个图的组。但这工作太慢了。无论我选择一个或一组数字,有时我都需要等待 10-15 秒。用于更改边框宽度。为什么这么慢?

4

3 回答 3

0

我的想法:

一个像素的宽度会导致更快的性能,因为可以使用基于线的图元来渲染边界。

当您使用大于 1 的宽度时,它必须使用实体填充图元,这会很慢。

于 2012-09-02T09:48:46.317 回答
0

您的代码正在编辑 SelectedItem 的边框、任何将 Selected 属性设置为 true 的 ObjectDrawn 以及所有绘制的属于某个组的对象的边框。

您的意思是还根据是否选择了组形状来过滤您的组边框图吗?
figure.isGroup && figure.Selected 否则,它似乎会修改所有组的边界,如果有很多组,无论您选择什么,都可能导致性能问题。

其他性能改进建议:
您在 SetBorderWidth 中执行此操作:
ObjectsDrawn[ObjectsDrawn.IndexOf(figure)].BorderWidth = border; 但您在 ChangeCascadeBorderWidth 中执行此操作: item.BorderWidth = width; 我建议在 SetBorderWidth 函数中执行相同操作,因为您已经拥有要修改的对象的实例,IndexOf 查找似乎不是必要的。

此外,如果设置 BorderWidth 属性的成本很高(即使设置为相同的现有值),那么像这样包装对 SetBorderWidth 的调用: if(item.BorderWidth != width) item.BorderWidth = width;可以节省性能。但是您必须根据设置边框宽度的成本来评估比较的成本。

于 2012-09-02T10:04:54.827 回答
0

您发布的所有瓶颈似乎都来自在形状上设置 BorderWidth 属性。我猜你会重新绘制或更新 BorderWidth 中形状的布局。如果您在容器上设置 BorderWidth,则会有很多不必要的重绘和布局更改,这在 WinForms 中有点慢(特别是对于布局,如果您的形状继承自 Control)。

我可以建议像其他一些 WinForms 控件一样的BeginUpdate *EndUpdate* 机制吗​​?

于 2012-09-02T15:37:59.153 回答