1

パノラマ ページを使用して Windows Phone 7 アプリケーションを開発しています。

このページには 2 つの項目があり、1 つ目はテキスト、2 つ目はコントロール マップです。この 2 番目のものは読み込みに時間がかかりすぎるため、次の方法で読み込むことにしました。

namespace Tested
{
    public partial class DemoDetail : PhoneApplicationPage
    {
        private bool isFirstNavigateToMap;
        private BackgroundWorker bgWorker;
        private Map map;

        public DemoDetail()
        {
            InitializeComponent();
            map = null;
            isFirstNavigateToMap = true;
            bgWorker = new BackgroundWorker();

            bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
            bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
        }

        private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            map = new Map();
        }

        private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (map != null)
                mapGrid.Children.Add(map);
        }

        private void Panorama_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            Panorama panorama = (Panorama)sender;
            PanoramaItem panoramaItem = (PanoramaItem)(panorama.SelectedItem);

            if ((isFirstNavigateToMap) && (panoramaItem.Name.Equals("mapPanoramaItem")))
            {
                isFirstNavigateToMap = false;
                bgWorker.RunWorkerAsync();
            }
        }
    }
}

しかし、2 番目のパノラマ アイテムに移動すると、次の例外が発生しますmap = new Map();

No se controló System.UnauthorizedAccessException
  Message=Invalid cross-thread access.
  StackTrace:
       at MS.Internal.XcpImports.CheckThread()
       at System.Windows.DependencyObject..ctor(UInt32 nativeTypeIndex, IntPtr constructDO)
       at System.Windows.DependencyObject..ctor(UInt32 nativeTypeIndex)
       at System.Windows.UIElement..ctor(UInt32 nKnownTypeIndex)
       at System.Windows.FrameworkElement..ctor(UInt32 nKnownTypeIndex)
       at System.Windows.Controls.Control..ctor(UInt32 nKnownTypeIndex)
       at System.Windows.Controls.ContentControl..ctor()
       at Microsoft.Phone.Controls.Maps.Core.MapBase..ctor()
       at Microsoft.Phone.Controls.Maps.Core.MapCore..ctor()
       at Microsoft.Phone.Controls.Maps.Map..ctor()
       at Demonstration.DemoDetail.bgWorker_DoWork(Object sender, DoWorkEventArgs e)
       at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
       at System.ComponentModel.BackgroundWorker.OnRun(Object argument)
       at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadPool.WorkItem.doWork(Object o)
       at System.Threading.Timer.ring()

コントロール マップを非同期で作成およびロードするにはどうすればよいですか?

4

2 に答える 2

2

あなたがしなければならないでしょう

Deployment.Current.Dispatcher.BeginInvoke(()=>
{ 
      map = new Map();   
});

UI に関係することはすべて、それを開始したスレッド (UI スレッド) で行う必要があります。バックグラウンド スレッドから UI にアクセスしている場合は、UI スレッドにキューから呼び出すように要求して、UI スレッドにアクションを実行させる必要があります。

PS: SO には類似のスレッドがたくさんありcross thread errorます。検索してください。

于 2012-10-28T18:47:42.097 に答える
0

私の知る限り、できません。Bing マップ コントロールは UI オブジェクトであるため、UI スレッドで作成する必要があります。

于 2012-10-28T16:41:51.330 に答える