Форум программистов, компьютерный форум, киберфорум
C#: XAML
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.74/34: Рейтинг темы: голосов - 34, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205

Avalonia (как сделать активной определенную вкладку)

12.01.2022, 22:19. Показов 9174. Ответов 82
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Как в Авалонии сделать, чтобы при нажатии на кнопку на первой вкладке TabControl, включалась вторая вкладка tabControl? Заранее спасибо
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.01.2022, 22:19
Ответы с готовыми решениями:

Сделать активной определенную вкладку tabControl
Банальный вопрос, но не могу найти Как сделать, чтобы при нажатии на кнопку на первой форме, включалась вторая вкладка tabControl на...

Как при открытии дочернего окна сделать активной вкладку в TabControl?
MDI интерфейс. В родительской форме кнопка для открытия дочерней. Как при открытии сделать активной определенную вкладку на дочерней форме?

Сделать определенную вкладку активной
Добрый день, суть вопроса: Есть страница с вкладками (табами) - как при переходе с другой страницы на страницу с табами делать...

82
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
17.01.2022, 21:56
Студворк — интернет-сервис помощи студентам
так удалите просто один, а второй оставьте
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
17.01.2022, 22:00  [ТС]
limeniye, так нельзя, по заданию для каждой вкладки должна быть своя ViewModel
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
17.01.2022, 22:04
Для каждой вкладки — своя ViewModel, но для каждой кнопки — только одна команда.

Добавлено через 1 минуту
И я немного упустил Вашу суть: а о каких вкладках идёт речь?
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
17.01.2022, 22:04  [ТС]
Скажите, пожалуйста, как быть, если в строке <Button Grid.Row="0" Content="Cформировать" Command="{Binding DoTheThing}" уже присутствует другой обработчик команды Command="{Binding Calc_click}". В одном обработчике не получается всё объединить.

У меня получается для одной вкладки TabControl - одна ViewModel_1, для другой вкладки - другая ViewModel_2.

Этот код у меня для ViewModel_1:

C#
1
2
3
4
5
6
private int _selectedTabIndex;
public int SelectedTabIndex
{
get => _selectedTabIndex;
set => this.RaiseAndSetIfChanged(ref _selectedTabIndex, value);
}
А вот этот код для ViewModel_2:

C#
1
2
3
4
5
6
7
8
9
10
11
public ReactiveCommand<Unit, Unit> DoTheThing { get; }
 
public MainWindowViewModel()
{
DoTheThing = ReactiveCommand.Create(RunTheThing);
}
 
void RunTheThing()
{
SelectedTabIndex = 1;
}
Так не работает - SelectedTabIndex не определен во второй ViewModel_2. Как быть? Помогите, пожалуйста
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
17.01.2022, 22:11  [ТС]
Извиняюсь, я не туда записала вопрос

Посмотрите, пожалуйста, вопрос в теме "Avalonia (как сделать активной определенную вкладку)"
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
17.01.2022, 22:24
Я не об этом. Я же не знаю, что у Вас на второй вкладке , чтобы сказать, как правильно строить архитектуру .

В прочем, ладно, можно универсализировать.

Допустим у Вас две каких-то ViewModel на которых есть по две команды.
Измените названия комманд, чтобы они были одинаковыми. Пример:
C#
1
2
3
4
public class FirstViewModel
{
    ReactiveCommand ClickCommand { get; set; }
}
C#
1
2
3
4
public class SecondViewModel
{
    ReactiveCommand ClickCommand { get; set; }
}
а потом на Вашей View оставьте одну привязку Command
XML
1
<Button Command="{Binding ClickCommand}"/>
Добавлено через 6 минут

Не по теме:

Цитата Сообщение от Sun1212 Посмотреть сообщение
Извиняюсь, я не туда записала вопрос
Посмотрите, пожалуйста, вопрос в теме "Avalonia (как сделать активной определенную вкладку)"
угу, вижу

1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
17.01.2022, 22:30
В таком случае получается, что у Вас две вкладки — это две разные View? Или для двух вкладок один и тот же шаблон страницы?


Используйте теги для подсветки соответствующего синтаксиса кода. Их можно вызвать нажатием на кнопки чуть выше поля ввода.
Добавлено через 22 минуты
Я глянул код, который отмечен как правильный, теперь стало понятнее. У Вас не 2 VM -- у Вас одна VM.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
17.01.2022, 23:28
Собрал решение, что называется "на коленке". Сурово, с костылями, но сильно усложнять не хотел.

Создал два UserControl'а -- это две страницы: для первого таба и для второго.

В оба таба просто впихнул одну кнопку: "Далее" и "Назад":
Пример одной из страниц
XML
1
2
3
4
5
<UserControl x:Class="AvaloniaApplication1.Views.Tab1UserControl" xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    
    <Button Content="Далее" Command="{Binding DoTheThing}" />
    
</UserControl>
Далее для каждой из них написал отдельную VM: Tab1ViewModel и Tab2ViewModel
Так как они одинаковые -- выложу только одну:
C#
1
2
3
4
5
6
    public class Tab1ViewModel
    {
        public TabChangingEventArgs TabChanging;
        public ReactiveCommand<Unit, Unit> DoTheThing { get; }
        public Tab1ViewModel() => DoTheThing = ReactiveCommand.Create(() => TabChanging?.Invoke(this, 1));
    }

НУ и главная VM:
C#
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
    public class MainWindowViewModel : ReactiveObject
    {
        public ObservableCollection<TabItem> Tabs { get; set; } = new ObservableCollection<TabItem>();
 
        private int _selectedTabIndex;
        public int SelectedTabIndex
        {
            get => _selectedTabIndex;
            set => this.RaiseAndSetIfChanged(ref _selectedTabIndex, value);
        }
 
        public MainWindowViewModel()
        {
            var tab1 = new Tab1ViewModel();
            var tab2 = new Tab2ViewModel();
 
            tab1.TabChanging += OnTabChanging;
            tab2.TabChanging += OnTabChanging;
 
            Tabs.Add(new TabItem() { Content = new Tab1UserControl() { DataContext = tab1 }, Header = "Tab 1" });
            Tabs.Add(new TabItem() { Content = new Tab2UserControl() { DataContext = tab2 }, Header = "Tab 2" });
        }
 
        private void OnTabChanging(object sender, int index) => SelectedTabIndex = index;
    }
С её отображением:
C#
1
2
3
4
5
<Window x:Class="AvaloniaApplication1.Views.MainWindow" xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
 
    <TabControl SelectedIndex="{Binding SelectedTabIndex}" Items="{Binding Tabs}"/>
    
</Window>
Архив прикрепляю соответственно:
TestTabNavigationForCyberForm.7z
2
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
18.01.2022, 00:06
Примечания: если хотите добавить что-то на первую страницу (или, например, изменить ей задний фон), то изменяйте файл Tab1UserControl. То же самое касается и Tab2UserControl.
1
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
18.01.2022, 18:35  [ТС]
limeniye, спасибо большое!!! Всё работает! А как быть, если для кнопки, которая на первой вкладке, есть еще один обработчик?

<Button Content="Далее" Command="{Binding DoTheThing} " Command="{Binding Сalc_click} " />

Понимаю, что так нельзя, в одной команде ссылка на свойство, а в другой просто код, как всё объединить?
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
18.01.2022, 18:39  [ТС]
А если на одной ViewModel для кнопки две команды нужно?
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
18.01.2022, 18:53
Sun1212, скажу Вам честно -- Вы сильно заблуждаетесь и говорите кашу. Давйте я помогу Вам сориентироваться, если Вы мне подробнее объсните зачем Вам два обработчика. Я хочу понять Ваше виденье и понимание.
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
18.01.2022, 18:59  [ТС]
limeniye, в обработчике Command="{Binding Сalc_click} происходит расчет какой-то задачи (кнопка на 1-ой вкладке запустит этот расчет), а результат должен появиться на другой вкладке
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
18.01.2022, 19:11
Sun1212, ага, теперь Вас понял.

Скажите, пожалуйста, то есть кнопка должна и менять страницу и изменять значение на второй и всё это на одном нажатии?
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
18.01.2022, 19:22
Хорошо. Сначала просто из первой страницы изменим значение на второй странице.

Тут нам понадобится MVVM.
В Вашей архитектуре получается есть две ViewModel, две View и одна Model.

Модель будет содержать число. Обе ViewModel'и будут "слушать" какое в данный момент значение числа и если оно изменится -- изменять его у себя.

Пример:
1
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
18.01.2022, 19:28  [ТС]
Цитата Сообщение от limeniye Посмотреть сообщение
Скажите, пожалуйста, то есть кнопка должна и менять страницу и изменять значение на второй и всё это на одном нажатии?
да, всё верно
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
18.01.2022, 19:29
Что происходит на картинке:
- мы нажали на кнопку;
- вызвалась команда;
- команда обратилась к Model и говорит: "Привет, Model, я хочу изменить у тебя значение твоего Result на двойку";
- Model говорит: "хорошо, я оповещу твою подругу Tab2ViewModel, что моё значение изменилось";
- Tab2ViewModel "слушает" внимательно Model, и Model говорит ей "Я изменила значение своего свойства Result на двойку";
- Tab2ViewModel берёт это значение и сохраняет у себя;
- Tab2View всегда слушает свою Tab2ViewModel, и она слышет, как Model передала Tab2ViewModel значение 2;
- ну она не растерялась и сразу же изменила это значение на View.
1
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
18.01.2022, 19:33  [ТС]
Цитата Сообщение от limeniye Посмотреть сообщение
Модель будет содержать число. Обе ViewModel'и будут "слушать" какое в данный момент значение числа и если оно изменится -- изменять его у себя.
Напишите, пожалуйста, чуть подробнее
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
18.01.2022, 19:34
Это означает, что у Вас должен быть третий класс -- который будет общим между ViewModel'ями.

Добавлено через 1 минуту
C#
1
2
3
4
public class Model 
{
    public int Result { get; set; } = 0;
}
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
18.01.2022, 19:35  [ТС]
Что-то как-то очень сложно получается...Попроще можно сделать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.01.2022, 19:35

Как сделать активной вкладку TPageControl
Создано MDI-приложение. На дочернем окне расположен компонент TPageControl Необходимо, что-бы при выборе пункта главного меню...

Как в Pagecontrol новую (созданную) вкладку сделать активной?
как в Pagecontrol новую(созданую) вкладку сделать активной? при нажатии на кнопку создаеться новая вкладка, как ее сделать активной?

Как сделать вкладку активной, если разные маршруты?
Всем привет!) Есть такая верстка &lt;div class=&quot;tabbable&quot;&gt; &lt;ul class=&quot;nav nav-tabs catalog&quot; id=&quot;main-tab&quot;&gt;...

Сделать вкладку активной при загрузке страницы
Добрый день. Есть страница: sspromo.ru/ticket.php ,тело которой сделано из вкладок, которые открывают части стр... При первом попадании на...

Как перейти на определенную вкладку?
У меня на форме имеется елемент с вкладками. Как программно перейти на ту или иную вкладку? Попробовал MyTabs.TabIndex = 2. Не получается.


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru