Подключите 2 пользовательские кнопки в C# на разных страницах вкладок
Мое приложение состоит из нескольких страниц вкладок.
На одном из них у нас есть 5 пользовательских кнопок, которые могут быть установлены с деталями, которые затем используются при нажатии на кнопку. Кнопки имеют 3 основных состояния.
На главной странице вкладки у меня есть 5 кнопок того же типа, которые являются репрезентативными для других кнопок, что в основном дает 5 пар кнопок.
Когда какая-либо кнопка нажата на любой вкладке, запускается код страницы, и мне нужно, чтобы другая парная кнопка была установлена в то же состояние.
Все кнопки используют один и тот же код из основного файла формы, а кнопки на вкладке Настройка связаны между собой через
this.commentatorPicks.PTR_Commentator_1.Click += new System.EventHandler(this.CommentatorPTR_Click); this.commentatorPicks.PTR_Commentator_2.Click += new System.EventHandler(this.CommentatorPTR_Click); this.commentatorPicks.PTR_Commentator_3.Click += new System.EventHandler(this.CommentatorPTR_Click); this.commentatorPicks.PTR_Commentator_4.Click += new System.EventHandler(this.CommentatorPTR_Click); this.commentatorPicks.PTR_Commentator_5.Click += new System.EventHandler(this.CommentatorPTR_Click);
с другими кнопками, связанными через событие OnClick.
Я пробовал несколько способов сохранить кнопки в синхронизации, например клонирование состояния сопряженной кнопки, которая не нажата, но состояние первой кнопки выглядит так, как будто оно не установлено до тех пор, пока не будет выполнен вызов
Код, который я пытаюсь запустить, таков
public void CommentatorPTR_Click(object sender, EventArgs e) { { PreviewTakeRemoveButton ptrBtn = sender as PreviewTakeRemoveButton; PreviewTakeRemoveButton remoteBtn = null; if (ptrBtn != null) { String name = (sender as Button).Name; int pos = name.LastIndexOf("_") + 1; String number = name.Substring(pos, name.Length - pos); if (name.StartsWith(NZRB_Global.Consts.MAIN_PICKS_BUTTON_PREFIX)) { remoteBtn = (PreviewTakeRemoveButton)inRaceSceneControl.GetControl(NZRB_Global.Consts.COMMENTATOR_PICKS_BUTTON_PREFIX + number); } else { remoteBtn = (PreviewTakeRemoveButton)inRaceSceneControl.GetControl(NZRB_Global.Consts.MAIN_PICKS_BUTTON_PREFIX + number); } String commentator = (String)ptrBtn.Tag; XmlNode picks = commentatorPicks.GetCommentatorPicks(commentator); if (null == picks) { // ptrBtn.ResetButton(); } else { NZRB_Global.Utils.LogButtonClick(sender, ptrBtn.Name + " " + ptrBtn.ButtonState); String dp = commentatorPicks.GetCommentatorDataPool(picks); switch (ptrBtn.ButtonState) { case PreviewTakeRemoveButton.PTRB_STATE.PBS_INACTIVE: inRaceSceneControl.SendVizCmd(false, dp); inRaceSceneControl.ShowScene(false, NZRB_Global.Consts.DIRECTOR_FF_SELECTIONS, Consts.GFX_LBAR_LAYER, null, SceneType.sports, true); break; case PreviewTakeRemoveButton.PTRB_STATE.PBS_TAKE: inRaceSceneControl.ClearScene(false, NZRB_Global.Consts.DIRECTOR_FF_SELECTIONS, Consts.GFX_LBAR_LAYER); inRaceSceneControl.SendVizCmd(true, dp); inRaceSceneControl.ShowScene(true, NZRB_Global.Consts.DIRECTOR_FF_SELECTIONS, Consts.GFX_LBAR_LAYER, null, SceneType.sports, true); break; case PreviewTakeRemoveButton.PTRB_STATE.PBS_REMOVE_TAKE: inRaceSceneControl.ClearScene(true, NZRB_Global.Consts.DIRECTOR_FF_SELECTIONS, Consts.GFX_LBAR_LAYER); break; } } remoteBtn.CloneButton(ptrBtn); } } }
Есть ли у кого-нибудь идеи, как я могу заставить это работать?
Что я уже пробовал:
Клонирование второго состояния кнопок
Установка второй кнопки в следующее состояние
Консервирование выполняют нажатием на вторую кнопку (бесконечный цикл)
Дополнительная информация :
I am using Winforms and it is quite a complex UI due to the working style of the operators. Basically there are many custom buttons and User Controls that send graphics to a "preview" machine and then the main on-air graphics engine. There are many scenes that can be sent and some scenes can co-exist with others while other scenes need to be removed automatically if another scene is sent over top. When a scene is removed automatically the corresponding buttons also need to be reset to a starting state. I also have to juggle the existence of a background that can be used with some of the scenes either manually or automatically. I have dealt with the current situation(in the short term at least) by ensuring the operator can only use one of the paired buttons at a time to remove the "mix and match" possibility. So once a button sends an image to either the preview or main display the corresponding "paired" button is disabled until the scene is removed either by another button click or automatically.
Gerry Schmitz
"Кнопки" не имеют состояния. Вариацией является ToggleButton или CheckBox; которые поддерживают "независимое" состояние. Состояние можно координировать с помощью "группы" "переключателей", но не кнопок. "Пользовательские кнопки" - это совсем другая история. Отсюда он выглядит чужим.
Jason Gleim
Вы не должны использовать кнопки для управления состоянием. Когда кнопка не видна на экране, она не обновляется. Таким образом, вы привязываетесь к установке свойств объекта, который не виден... это ничего не даст.
Вы должны управлять своим состоянием с помощью объекта. Обновите состояние в обработчиках щелчков, а затем отразите его обратно на кнопках. Однако вы не говорите, используете ли вы winforms или xaml для пользовательского интерфейса. Вы также можете столкнуться с ситуацией, когда вы не можете обновить состояние кнопки изнутри обработчика событий. Вокруг этого существуют правила, например, вы не можете вызвать событие, которое приводит к изменениям пользовательского интерфейса изнутри обработчика событий для события, вызванного пользовательским интерфейсом. Вы должны отделить одно событие от другого с помощью таймера или раскадровки или чего-то подобного, что позволяет потоку пользовательского интерфейса выйти из текущего обработчика событий перед входом в новый.
Лучшим подходом было бы привязка данных кнопок обратно к глобальному объекту состояния, реализующему INotifyPropertyChanged. Это легко сделать в xaml, но гораздо сложнее в Winforms.
Member 13724700
Я использую Winforms, и это довольно сложный пользовательский интерфейс из-за стиля работы операторов.
В основном существует множество пользовательских кнопок и пользовательских элементов управления, которые отправляют графику на машину "предварительного просмотра", а затем на основной графический движок в эфире.
Есть много сцен, которые могут быть отправлены, и некоторые сцены могут сосуществовать с другими, в то время как другие сцены должны быть удалены автоматически, если другая сцена отправляется сверху.
Когда сцена удаляется автоматически, соответствующие кнопки также должны быть сброшены в исходное состояние.
Мне также приходится жонглировать существованием фона, который можно использовать с некоторыми сценами вручную или автоматически.
Я справился с текущей ситуацией(по крайней мере, в краткосрочной перспективе), убедившись, что оператор может использовать только одну из парных кнопок одновременно, чтобы удалить возможность "смешивать и сочетать". Таким образом, как только кнопка отправляет изображение либо на предварительный просмотр, либо на главный дисплей, соответствующая "парная" кнопка отключается до тех пор, пока сцена не будет удалена либо другим нажатием кнопки, либо автоматически.