Обработчик событий, расположенный в другом классе, чем MainWindow

Поэтому я следовал руководству на следующем сайте, чтобы ограничить символы, которые может принимать текстовое поле.

http://www.rhyous.com/2010/06/18/how-to-limit-or-prevent-characters-in-a-textbox-in-csharp/

Моя проблема в том, что я не могу понять, как запустить обработчик событий во вторичном классе. В основном, как я могу сказать VS искать код обработчика событий в этом классе вместо MainWindow? Я пытался искать, но, видимо, не знаю правильных терминов. Ссылка на xaml, которую я использовал, была

xmlns:DigitBox="clr-namespace:System.Windows.Controls;assembly=PresentationFramework"

Любые идеи?


person Keven M    schedule 05.11.2011    source источник
comment
Покажите разметку, которую вы используете для добавления элемента управления в Window или UserControl, включая регистрацию события.   -  person Steve Rowbotham    schedule 05.11.2011


Ответы (2)


Гораздо лучше использовать команды и привязки команд. Я не уверен, какая конкретная команда будет привязана к текстовому полю для желаемой функциональности, но одной из целей WPF было уменьшить использование обработчиков событий в коде позади.

Ознакомьтесь с этой статьей, чтобы получить обзор команд и эту статью, чтобы узнать, как связать команды с Мероприятия. Командование WPF — одна из самых крутых функций, позволяющая по-настоящему разделить задачи между пользовательским интерфейсом и бизнес-логикой.

В качестве решения для наихудшего сценария вы можете создать собственное текстовое поле, которое наследуется от элемента управления текстовым полем, и подключить события в этом классе. Тогда ваш элемент управления можно будет использовать повторно.

person Nate Noonen    schedule 05.11.2011
comment
Текстовое поле наследует от обычного элемента управления текстовым полем ... Я просто не знаю, как разрешить это wpf :). Он продолжает пытаться заставить его использовать обычное текстовое поле - person Keven M; 05.11.2011
comment
Вы добавляете его как обычное текстовое поле? Вы должны добавить его явно: в определении окна добавьте что-то вроде этого: xmlns:inh=clr-namespace:MyNamespace.InheritedControls, а затем, когда вы добавляете текстовое поле, добавьте его следующим образом: ‹inh:MaskedTextBox Name=myTextBox /› - person Nate Noonen; 05.11.2011
comment
Хорошо, я попробую это, когда вернусь домой. В этой строке xaml текстового поля я вообще изменяю стандартный вызов события, или двойной щелчок по конкретному событию автоматически добавит обработчик события в класс DigitText вместо класса MainWindow? - person Keven M; 05.11.2011
comment
Если событие является пользовательским, возможно, вам придется сделать его свойством зависимостей. Если нет, он должен работать нормально для вас. - person Nate Noonen; 06.11.2011
comment
Фактически, вы можете обрабатывать событие в обоих местах. Пока вы правильно используете элемент управления и не отмечаете e.Handled = true. - person Nate Noonen; 06.11.2011

Самый простой способ, который я нашел, - назначить событие в вашем конструкторе.

public MainWindow()
    {
        InitializeComponent();
        TextBoxCurrency.GotFocus += expandedTextBoxEvents.TextBoxCurrencyGotFocus;
        TextBoxCurrency.LostFocus += expandedTextBoxEvents.TextBoxCurrencyLostFocus;
    }

Я искал способ сделать это в XAML, и я не нашел простого и чистого способа сделать это.

person Guish    schedule 13.04.2015
comment
Чтобы завершить ответ, объект окна можно передать конструктору для доступа к компонентам. new TextBoxCurrency(this); - person A. Morel; 09.11.2019