Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626

Как записать в Label из другого класса

17.02.2016, 12:37. Показов 4529. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Прочитал о том, что не рекомендуется какую то логику программы реализовывать в обработчиках кнопок, а нужно выносить в отдельные файлы, тогда как в обработчиках только записывать переменные и вызывать методы. Начал пробовать писать в таком стиле и столкнулся с проблемой в самом начале. Для простоты объяснения пример упрощаю до: есть WPF окно, которое содержит Label и Button. Обработчик событий Button файла MainWindow:
C#
1
2
3
4
5
private void ButtonClick(object sender, KeyEventArgs e)
        {
            Test test = new Test();
            test.Work();
        }
В методе Work() файла Test.cs мне требуется вывести пользователю информацию в окно, то есть записать значение в Label окна. Как это сделать? Из метода Work() я не вижу MainWindow.Label, поэтому и его свойству content не могу присвоить значение. Объясните как это реализовать.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.02.2016, 12:37
Ответы с готовыми решениями:

Qt. Как изменить значение в label из другого класса
У меня есть класс GLWidget, в котором я прописываю основные функции. Там же есть функция движения мыши по виджету Glwidget. Проблема в том,...

Как поменять фон Label из метода? И как занести данные в массив из другого класса
Пишу крестики нолики, есть два лэйбла "игрок 1", "игрок 2". Хочу чтобы фон подсвечивался у игрока чей ход. Не могу найти инфу как к лейблу...

Создание label из другого класса
Label создается, но при выводе отображается в отдельном окне. Как сделать так, чтобы он отображался внутри MainWindow в определенном месте?...

8
Заблокирован
17.02.2016, 12:44
Цитата Сообщение от Chizel Посмотреть сообщение
Объясните как это реализовать.
Chizel, Метод класса Test ничего не знает, куда вы будете выводить информацию. Следовательно, просто верните из него string:

C#
1
2
3
Test test = new Test();
string info = test.Work();
lbl.Text = info;
Потом переходите на новый уровень и используйте привязки.
1
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
17.02.2016, 12:51  [ТС]
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Потом переходите на новый уровень и используйте привязки.
Поясните эту фразу, пожалуйста. Что значит перейти на новый уровень?

А если усложнить до: у меня в work() цикл, который в каждой своей итерации выводит сообщения, причем еще и в разные Label'ы должен это делать?
0
Заблокирован
17.02.2016, 13:08
Цитата Сообщение от Chizel Посмотреть сообщение
Поясните эту фразу, пожалуйста. Что значит перейти на новый уровень?
Chizel, хм, использовать WPF максимально полезно.

Цитата Сообщение от Chizel Посмотреть сообщение
А если у меня в work() цикл, который в каждой своей итерации выводит сообщения, причем еще и в разные Label'ы должен это делать?
Похоже на проблему XY. Какую задачу решаете?
0
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
17.02.2016, 13:24  [ТС]
Да пишу программу для отжиманий. Радиокнопками хочу выставлять количество подходов и количество секунд отдыха между подходами, затем нажимаю кнопку СТАРТ и в Label1 записывается количество оставшихся подходов, а в Label2 количество секунд отдыха. Иду отжиматься, после нажимаю на любую кнопку на клавиатуре и начинает тикать таймер обратного отсчета обновляясь в Label2 постоянно, когда он доходит до 0 звучит звуковой сигнал и в Label1 записывается количество оставшихся подходов. А я иду отжиматься...и так, пока подходы не закончатся.
В консоли то все просто, в цикле вывожу все это в консоль и все. А вот раз WPF начал изучать, так и программку свою переписать решил
0
Заблокирован
17.02.2016, 14:22
Chizel, тогда внутренний цикл не нужен. Существует стандартный таймер - его и используйте.

Если хотите, вечером могу написать пример.
0
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
17.02.2016, 14:41  [ТС]
А для подсчета количества подходов все равно ведь нужен цикл? Пример любопытно посмотреть, с точки зрения правильного построения WPF приложений.
0
Заблокирован
18.02.2016, 14:22
Лучший ответ Сообщение было отмечено Chizel как решение

Решение

Chizel, вчера не успел
Исправляюсь. Пример (правда, на F# - последнее время практически только его и использую)

.xaml:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    <Grid>    
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid Grid.Row="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <TextBox Grid.Column="0" Margin="2" Text="{Binding Count,UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding Enabled}"></TextBox>
            <TextBox Grid.Column="1" Margin="2" Text="{Binding Interval,UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding Enabled}"></TextBox>
            <Button Grid.Column="2" Margin="2" Content="Start" Command="{Binding StartCommand}" IsEnabled="{Binding ButtonEnabled}"></Button>
        </Grid>
        <TextBlock  Grid.Row="1" Margin="5" Text="{Binding Time,UpdateSourceTrigger=PropertyChanged}" FontSize="40" VerticalAlignment="Center"  HorizontalAlignment="Center"></TextBlock>
    </Grid>
F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//модель; количество подходов, интервал перерыва
type Exercise = {Count:int; Interval:int}
                with static member GetDefault = {Count = 3; Interval = 120}
 
type MainViewModel() as self = 
    inherit ViewModelBase()    
 
    let second = 1000.0 
    let mutable exercise = Exercise.GetDefault 
 
    //наблюдаемые переменные 
    let enabled = self.Factory.Backing(<@ self.Enabled @>, true)
    let buttonEnabled = self.Factory.Backing(<@ self.ButtonEnabled @>, true)
    let time = self.Factory.Backing(<@ self.Time @>, exercise.Interval)
 
    //функция обновления, вызывается каждую секундку
    let update (timer:System.Timers.Timer) x = 
        if x >= 0 then time.Value <- x //если еще не дошли до 0, уменьшаем значение
        else //в противном случае
           timer.Stop() //останавливаем таймер
           time.Value <- exercise.Interval //возвращаем исходный интервал
           buttonEnabled.Value <- true //разрешаем запустить таймер снова 
           exercise <- {exercise with Count = exercise.Count - 1} // уменьшаем количество оставшихся подходов
           self.RaisePropertyChanged(<@ self.Count @>) //обновляем отображение
           if exercise.Count = 0 then enabled.Value <- true 
        self.RaisePropertyChanged(<@ self.Time @>)
 
    let start _ = 
        buttonEnabled.Value <- false //блокируем кнопку
        //если текстовые поля еще не заблокированы, блокируем их
        if enabled.Value = true then enabled.Value <- false
        //создаем таймер
        let timer = new System.Timers.Timer(second)
        (exercise.Interval, timer.Elapsed)    
        ||> Observable.scan(fun x _ -> x - 1)     //"сканируем" событие, уменьшая на единицу старторове значение
        |> Observable.subscribe(update timer) //вызываем функцию при каждом наблюдении
        |> ignore //игнорируем результат
        async { timer.Start() }
 
        
    let startCommand = self.Factory.CommandAsync(start)
 
    //свойства для связи с View
    //комманда, выполняема при нажатии на кнопку
    member self.StartCommand = startCommand
    
    member self.Count with get() = exercise.Count
                      and set v  = exercise <- {exercise with Count = v}
 
    member self.Interval with get() = exercise.Interval 
                         and set v  = exercise <- {exercise with Interval = v}
                                      time.Value <- v
                                      self.RaisePropertyChanged(<@ self.Time @>)    
 
    member self.Time with get() = time.Value 
    member self.Enabled with get() = enabled.Value
    member self.ButtonEnabled with get() = buttonEnabled.Value



код не самый чистый, но...для примера подойдет

P.S. Корректность ввода, разумеется, не делал. Архив с проектом прикрепил.
Вложения
Тип файла: rar FsSimpleEp2.rar (1.25 Мб, 7 просмотров)
1
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
18.02.2016, 15:02  [ТС]
Огромное спасибо. А то я уже в дебри MVVM полез Буду смотреть, разбираться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.02.2016, 15:02
Помогаю со студенческими работами здесь

Изменить контент label из другого класса
Добрый вечер =) вот возник вопрос, как поменять контент у label'а? То, что Label1.Content = &quot;Новое содержимое&quot;; мне понятно, а...

Изменение текста Label из другого класса
Добрый день, в общем у меня форма(Form1), на которой 5 кнопок. При нажатии на одну кнопку, я вызываю public void randomname() в другом...

Доступ к label.content из другого класса
Всем добрый вечер, как из класса не MAinWindow сделать вот это label.content=&quot;Пример&quot;; не нашёл не чего работающего. Мне...

Изменения текста Label из другого класса
Привет! Есть отдельный класс там таймер, и по таймеру выполняется определенная работа, так вот, нужно чтоб из этого класса менялась надпись...

Изменение текста Label в цикле из другого класса
Здравствуйте! Пользовался поиском, но так и не разобрался как это сделать, да к тому же в цикле. Есть основной класс MainWindow, он...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru