C#在地图上显示gps位置

时间:2010-06-30 01:36:32

标签: c# windows-mobile

我在Windows移动应用程序中工作,我想用谷歌地图显示我当前的位置。我使用了样本中的Location dll。正如您在我的代码中看到的那样,我在 gps_Locationchanged 事件中调用了正确的方法来更新地图,其中我使用调用方法来更新pictureboxe的图像。问题是我无论何时何时都无法使用应用程序的主菜单和上下文菜单。这就像他们冻结,直到新地图完成下载。是否有另一种方法可以在不同的线程中执行此操作,以便可以随时使用它们?

void gps_LocationChanged(object sender, LocationChangedEventArgs args)
{
    if (args.Position.LatitudeValid && args.Position.LongitudeValid)
    {

       pictureBox1.Invoke((UpdateMap)delegate()
         {
             center.Latitude = args.Position.Latitude;
             center.Longitude = args.Position.Longitude;
             LatLongToPixel(center);
             image_request2(args.Position.Latitude, args.Position.Longitude);

         });
    }
}

2 个答案:

答案 0 :(得分:3)

很难肯定地说,但看起来像(我假设)从服务器获取实际图像的image_request2()方法是个问题。如果您要在工作线程上运行此方法,并提供一个简单的回调方法,一旦完全下载后将在屏幕上绘制图像,这将使您的UI线程保持打开状态以接收来自用户的事件。

答案 1 :(得分:3)

也许是这些方面的东西?

    bool m_fetching;

    void gps_LocationChanged(object sender, LocationChangedEventArgs args)
    {
        if (m_fetching) return;

        if (args.Position.LatitudeValid && args.Position.LongitudeValid)
        {
            ThreadPool.QueueUserWorkItem(UpdateProc, args);
        }
    }

    private void UpdateProc(object state)
    {
        m_fetching = true;

        LocationChangedEventArgs args = (LocationChangedEventArgs)state;
        try
        {
            // do this async
            var image = image_request2(args.Position.Latitude, args.Position.Longitude);

            // now that we have the image, do a synchronous call in the UI
            pictureBox1.Invoke((UpdateMap)delegate()
            {
                center.Latitude = args.Position.Latitude;
                center.Longitude = args.Position.Longitude;
                LatLongToPixel(center);
                image;
            });
        }
        finally
        {
            m_fetching = false;
        }
    }