Visual Studio 2012 (WPF)
Создание часов на форме.
Для доступа к элементу UI главного окна TextBox из стороннего класса создадим в отдельном статическом классе Consts.cs (public static class Consts) структуру:
public struct Rect
{
public System.Windows.Threading.Dispatcher dm; //Поток главного окна MainWindow
public System.Windows.Controls.TextBox tb1; //MainWindow TextBox tb1
}
В этой структуре можно описать все элементы формы.
Создадим сторонний класс:
using System.Threading;
using System.Windows.Threading;
public class Class1
{
public bool StopThread { get; set; } //Остановить фоновый поток
public Consts.Rect par { get; set; } //Ссылка на структуру главной формы (par - параметры)
public void Start()
{
Thread1();
}
private void Thread1() //Организация фонового потока
{
ThreadStart start1 = delegate()
{
while (!StopThread) //При закрытии формы изменить на true и остановить поток
{
//Вместо Dispatcher.BeginInvoke пишем так:
par.dm.BeginInvoke(new ThreadStart(delegate
{
//На главной форме отображать дату и время:
par.tb1.Text = DateTime.Now.ToString();
}));
Thread.Sleep(1000); //Задержка на 1 секунду
}
};
new Thread(start1).Start();
}
}
Класс главной формы:
public partial class MainWindow : Window
{
Class1 cl = new Class1(); //Объявляем класс фонового потока
//После показа окна:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Consts.Rect par;
par.dm = this.Dispatcher; //Передача потока главной формы
par.tb1 = this.tb1; //Ссылка на изменяемый в фоне TextBox
cl.par = par; //Передаем параметры
cl.StopThread = false; //Фоновый поток будет работать
cl.Start();
}
//Контрольная кнопка на форме для демонстрации возможности работы в форме:
private void bt1_Click(object sender, RoutedEventArgs e)
{
tb2.Text = tb1.Text; //При нажатии кнопки, вывести текст в другой TextBox
}
//При закрытии формы остановить поток:
private void Window_Closed(object sender, EventArgs e)
{
cl.StopThread = true;
}
}
PS А можно в MainWindow.xaml прописать наименование формы:
Title="MainWindow" Height="350" Width="525"
Name="mWindows"
и использовать его в стороннем классе:
public MainWindow mw { get; set; }
но это не по-варварски :)
Создание часов на форме.
Для доступа к элементу UI главного окна TextBox из стороннего класса создадим в отдельном статическом классе Consts.cs (public static class Consts) структуру:
public struct Rect
{
public System.Windows.Threading.Dispatcher dm; //Поток главного окна MainWindow
public System.Windows.Controls.TextBox tb1; //MainWindow TextBox tb1
}
В этой структуре можно описать все элементы формы.
Создадим сторонний класс:
using System.Threading;
using System.Windows.Threading;
public class Class1
{
public bool StopThread { get; set; } //Остановить фоновый поток
public Consts.Rect par { get; set; } //Ссылка на структуру главной формы (par - параметры)
public void Start()
{
Thread1();
}
private void Thread1() //Организация фонового потока
{
ThreadStart start1 = delegate()
{
while (!StopThread) //При закрытии формы изменить на true и остановить поток
{
//Вместо Dispatcher.BeginInvoke пишем так:
par.dm.BeginInvoke(new ThreadStart(delegate
{
//На главной форме отображать дату и время:
par.tb1.Text = DateTime.Now.ToString();
}));
Thread.Sleep(1000); //Задержка на 1 секунду
}
};
new Thread(start1).Start();
}
}
Класс главной формы:
public partial class MainWindow : Window
{
Class1 cl = new Class1(); //Объявляем класс фонового потока
//После показа окна:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Consts.Rect par;
par.dm = this.Dispatcher; //Передача потока главной формы
par.tb1 = this.tb1; //Ссылка на изменяемый в фоне TextBox
cl.par = par; //Передаем параметры
cl.StopThread = false; //Фоновый поток будет работать
cl.Start();
}
//Контрольная кнопка на форме для демонстрации возможности работы в форме:
private void bt1_Click(object sender, RoutedEventArgs e)
{
tb2.Text = tb1.Text; //При нажатии кнопки, вывести текст в другой TextBox
}
//При закрытии формы остановить поток:
private void Window_Closed(object sender, EventArgs e)
{
cl.StopThread = true;
}
}
PS А можно в MainWindow.xaml прописать наименование формы:
Title="MainWindow" Height="350" Width="525"
Name="mWindows"
и использовать его в стороннем классе:
public MainWindow mw { get; set; }
но это не по-варварски :)
