0

我正在尝试为我现有的多边形绘图的重绘功能生成一个线程。我在这里读到有可能 UI 可以在线程中实现,请参见此处的链接,但我不能在我的 redrawSingelPoly() 函数上使用它......有什么想法可以将 redrawSingelPoly() 用作线程吗?

在我的 MainWindow.xaml.cs 中:

当用户按下我的主窗口上的按钮时调用:

    private void SingleSelectedMeasurement(object sender, RoutedEventArgs e)
    {
        System.Windows.Controls.Button button = (System.Windows.Controls.Button)sender;
        RedrawSingelMeasurement(Convert.ToInt16(button.Tag));
    }

    private void RedrawSingelMeasurement(int selectedMeasurement)
    {
        selectedMeasurement = selectedMeasurement - 1;

        for (int i = 0; i < measurements.Length; i++)
        {
            if (selectedMeasurement != i) 
            {
                measurements[i].draw = false; //block drawing
            }
            else
            {
                measurements[i].draw = true; // remove block for drawing
            }
        }
            measurements[selectedMeasurement].redrawSingelPoly(); 
    }

在我的 Measurement.cs 中:

    public void redrawSingelPoly() 
    {
        Polyline poly = new Polyline();
        poly.Stroke = colorBrush; 
        poly.StrokeThickness = basicLineThick;

        //first clean all
        coordinateSystem.Children.Clear(); 

        poly.Points = points;
        //draw
        coordinateSystem.Children.Add(poly);
    }
4

4 回答 4

0

理想情况下,一个窗口只能在一个 Dispatcher 上运行,但是您可以通过 HostVisual 将不同的视觉效果放在不同的线程中,但在非常有限的情况下。也许这篇文章可以帮助你:

http://blogs.msdn.com/b/dwayneneed/archive/2007/04/26/multithreaded-ui-hostvisual.aspx

于 2013-06-25T17:28:19.270 回答
0

你提到的文章所说的实际上是每个窗口只有一个线程。无法在不同的线程中绘制专用元素。

于 2013-06-25T17:33:32.933 回答
0

您无法从与其相关的线程不同的线程访问 DependencyObject 的 DependencyProperties(在您的情况下为:坐标系统)。

如果你想加速你的应用程序,你应该创建自定义控件,覆盖它的 OnRender 方法并在那里绘制你的自定义图形:它将删除许多逻辑和可视树逻辑,并且工作得更快。

于 2013-06-25T16:04:42.493 回答
0
private void SingleSelectedMeasurement(object sender, RoutedEventArgs e)
{
    var button = (System.Windows.Controls.Button)sender;

    Task.Factory.StartNew (
       () => OnUi(RedrawSingelMeasurement(Convert.ToInt16(button.Tag))));        
}

//here's a sample on how to get despatcher for the ui thread
private void OnUi (Action action)
    {
        if (_dispatchService == null) 
            _dispatchService = ServiceLocator.Current.GetInstance<IDispatchService>();
            //or _dispatchService  = Application.Current.Dispatcher - whatever is suitable

        if (_dispatchService.CheckAccess())
            action.Invoke ();
        else
            _dispatchService.Invoke(action);
    }
于 2013-06-25T18:14:38.133 回答