2013-05-28 7 views
0

У меня есть WPF Control, размещенный в winform, в котором есть Меню и некоторые метки. Элементы управления WPF подключаются к Интернету для загрузки некоторых данных. Я делю код на два этапа. сначала просто установил свойства управления. второй подключился к сети второй пробег внутри потока, , но элементы управления Winform не состоят в форме до тех пор, пока управление WPF не закончит два его шага.WPF Control Хостинг в WinForm Блоки управления WinForm из загруженных даже с помощью потока

Я пробовал много подход, чтобы сделать его потоковым , но все пути идут в том же направлении.

КОД WPF управления 1- Нагрузка

private void MDI_Load(object sender, EventArgs e) 
    { 
     MenuManager.FillMenu(MainMenu); // I have filled WinForm Menu first, but it doesn't appear until WPF finish 

     #region = WPF Control = 

     wpfManager.AddweatherControl(); 
     wpfManager.weatherManager.Start(); // This have to run in another thread 

     #endregion 
} 

2- wpfManager.weatherManager.Start

public void Start() 
{ 
    //var tsk = System.Threading.Tasks.Task.Factory.StartNew(GetWeather); 
    //tsk.ContinueWith(t => { MessageBox.Show(t.Exception.InnerException.Message); }, 
    // System.Threading.CancellationToken.None, System.Threading.Tasks.TaskContinuationOptions.OnlyOnFaulted, 
    // System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext()); 

    //System.Threading.Thread t = new System.Threading.Thread(
    // () => weatherControl.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(GetWeather)) 
    // ); 
    //t.SetApartmentState(System.Threading.ApartmentState.STA); 
    //t.Start(); 

    weatherControl.Dispatcher.BeginInvoke(new Action(GetWeather), new object[] { }); 
} 

void GetWeather() 
{ 
    #region = Weather = 
    Yweather.Getweather(UserManager.CurrentUser.Preferences.WeatherCity); 

    if (Yweather.Online && Yweather.IDayForecast.Count > 0) 
    { 
     weatherControl.CurrentDegree.Text = Yweather.IDayForecast[0].CurrentTemperature.ToString(); 
     weatherControl.WeatherTypeName.Text = Yweather.IDayForecast[1].WeatherText; 
     weatherControl.AllDayDegree.Text = Yweather.IDayForecast[1].LowTemperature + " - " + Yweather.IDayForecast[1].HighTemperature; 
     weatherControl.WeatherType.Source = wpfManager.BitmapToImageSource(Yweather.IDayForecast[0].Image); 

     xWeatherDay weatherday1 = weatherControl.OhterDaysPanel.Children[0] as xWeatherDay; 
     weatherday1.AllDayDegree.Text = Yweather.IDayForecast[2].LowTemperature + " - " + Yweather.IDayForecast[2].HighTemperature; 
     weatherday1.WeatherType.Source = wpfManager.BitmapToImageSource(Yweather.IDayForecast[2].Image); 
    } 
    else 
    { 
     weatherControl.CurrentDegree.Text = "0"; 
     weatherControl.WeatherTypeName.Text = "NAN"; 
     weatherControl.AllDayDegree.Text = "0 - 0"; 
     weatherControl.WeatherType.Source = wpfManager.BitmapToImageSource(Yweather.OfflineImage); 
    } 

    #endregion 
} 

ответ

1

Похоже, из кода вы писали о том, что задержка вызвана запуском GetWeather на Пользовательский интерфейс. Предполагая, что weatherControl является экземпляром элемента управления WPF, это выполняется в потоке пользовательского интерфейса, потому что это поток, к которому принадлежит его диспетчер.

Если вы хотите запустить код на фоновом потоке, один из простых способов сделать это - использовать BackgroundWorker. Вы можете использовать это что-то вроде этого:

public void Start() 
{ 
    var worker = new BackgroundWorker(); 
    worker.DoWork += (sender, args) => 
    { 
     GetWeather(); 
     // put the results of getting the weather in to args.Result 
    }; 
    worker.RunWorkerCompleted += (sender, args) => 
    { 
     // use args.Result to update the UI 
    }; 
    worker.RunWorkerAsync(); 
} 

код в обработчик события DoWork работает в фоновом потоке, в то время как код в обработчик события RunWorkerCompleted работает в потоке пользовательского интерфейса.

+0

Я не знаю, как поблагодарить вас, Он работает как шарм. :) –

Смежные вопросы