2017-01-11 8 views
0

Моя визуальная настройка проект студии, как это: На Форма «s панель добавить контроль пользователя (UC) с кодом:Многопоточность формы и пользовательский контроль

в Форма:

panel.Controls.Add(UC.Instance); 
UC.Instance.Location = new Point(-(panel.Size.Width), 0); 
UC.Instance.BringToFront(); 
roll_in(); 

в управления пользователя:

private static UC _instance; 
public static UC Instance 
{ 
    get 
    { 
     if (_instance == null) 
      _instance = new UC(); 
     return _instance; 
    } 
} 

При нажатии кнопки на формы управление пользователя добавляется к панели Form и я использую следующий код, чтобы скользить управление пользователя своей позиции:

private void roll_in() 
{ 
    while (UC.Instance.Location.X < panel.Location.X) 
    { 
     UC.Instance.Location = new Point((UC.Instance.Location.X + 2)); 
     UC.Instance.Refresh(); 
     if (UC.Instance.Location.X > -10) 
      System.Threading.Thread.Sleep(10); 
    } 
} 

Когда я используйте roll_in(), все остальные функции и формы ждут завершения этого процесса.

Есть ли способ передвинуть User control на другую тему? Я попытался позвонить roll_in() с созданием другого потока, но он говорит, что элемент управления был создан в другом потоке.

Может ли кто-нибудь помочь мне направить меня на правильный путь? Как я могу сделать «анимацию» без влияния на другие элементы управления?

Спасибо помогает

+1

Winforms + Анимации = WPF –

+0

Помимо что я должен создать класс Animator с таймером внутри для обработки анимации. Animator.AnimateLocation (control: myControl, newLocation: new Point (x, y), продолжительность: TimeSpan.FromSeconds (2)) –

ответ

0

Он смотрит на меня, как ваше блокирование потока пользовательского интерфейса путем вызова Thread.Sleep. Вы вообще не хотите делать это по какой-либо причине. асинхронные задачи были созданы для решения таких проблем. Попробуйте этот код.

private async void roll_in() 
{ 
    while (UC.Instance.Location.X < panel.Location.X) 
    { 
     UC.Instance.Location = new Point((UC.Instance.Location.X + 2)); 
     UC.Instance.Refresh(); 
     if (UC.Instance.Location.X > -10) 
      await Task.Delay(10); 
    } 
} 

Это должно предотвратить блокирование во время циклов сна.

+0

Это работает очень хорошо! Спасибо за это решение –

0

Вы также можете использовать Application.DoEvents() внутри цикла для обработки очереди WinForms события через регулярные промежутки времени:

private void roll_in() 
{ 
    while (UC.Instance.Location.X < panel.Location.X) 
    { 
     UC.Instance.Location = new Point((UC.Instance.Location.X + 2)); 
     UC.Instance.Refresh(); 
     Application.DoEvents(); 
} 

}

Информация о Application.DoEvents(): https://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents(v=vs.110).aspx

+0

Это, кажется, простое решение! Я включил библиотеку WinFormAnimation для создания анимаций! Но спасибо за решение, я пробовал с DoEvents(), и он работает довольно аккуратно! –

+0

Есть ли способ добавить задержку? –

+0

@NikoLeben, что вы хотите отложить? Вызов 'DoEvents()'? – user783836

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