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

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

12.01.2022, 22:19. Показов 9110. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru