вторник, 16 августа 2016 г.

c# wpf. Доступ к элементам формы из стороннего класса

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; }
но это не по-варварски :)