执行WPF期间重绘图像

时间:2013-10-24 12:51:09

标签: c# wpf image

我有一个小应用程序应该将图像设置为红色或绿色,具体取决于所做的一些测试。测试可能需要几秒钟,每个测试都有一个自定义控件,图像连接到它。当我点击开始时,我想要完成第一个测试,通过更改该图像上的图像来显示结果,然后继续。但就像现在一样,所有测试都进行了(可能是10秒),然后所有的灯都在同时变化。如何在执行期间强制自定义控件更新图像?

private void start_Click(object sender, RoutedEventArgs e)
    {
        foreach (TestObject tObj in tObjList)
        {
            bool testResult = tObj.makeTest();
            foreach (TestShower ts in m_TSList)
            {
                if (tObj == ts.gettObj())
                {
                    if (testResult == true)
                        ts.setLightOn();
                    else
                        ts.setLightOff();

                    ts.UpdateLayout();
                    break;
                }
            }
        }
    }    

public void setLightOn()
    {
        string strUri2 = String.Format(@"pack://application:,,,/;component/Images/Signal_On.png");
        BitmapImage img = new BitmapImage(new Uri(strUri2));
        iStatus.Source = null;
        iStatus.Source = img;
    }

public void setLightOff()
    {
        string strUri2 = String.Format(@"pack://application:,,,/;component/Images/Signal_Off.png");
        BitmapImage img = new BitmapImage(new Uri(strUri2));
        iStatus.Source = null;
        iStatus.Source = img;
    }

2 个答案:

答案 0 :(得分:0)

在后台运行测试,然后使用Dispatcher更新UI线程: 对于WPF&净4.5。你可以使用TPL

private void start_Click(object sender, RoutedEventArgs e)
{
    Task.Run(()=>{
    foreach (TestObject tObj in tObjList)
    {
        bool testResult = tObj.makeTest();
        Dispatcher.Invoke(()=>{
        foreach (TestShower ts in m_TSList)
        {
            if (tObj == ts.gettObj())
            {
                if (testResult == true)
                    ts.setLightOn();
                else
                    ts.setLightOff();

                ts.UpdateLayout();
                break;
            }
        }});
       }
    }
  });
}    

答案 1 :(得分:0)

你应该读入异步并等待并同时执行每个测试并等待结果(显然这假设你的测试不是相互依赖的)

以及

的某种形式的实施
Task.Factory.StartNew(() => {
var result = ts.makeTest();
setLight1(result);

})

虽然不知道更多,但似乎可以使用数据绑定到在测试对象列表上实现INotifyPropertyChanged的ViewModel来执行此操作。

但不是异步执行测试是导致问题的主要原因

我知道外部链接在SO中并不是首选,但这是一个教程

http://www.youtube.com/watch?v=ZyFL3hjHADs