В приложении WPF предположим, что существует «n» количество изображений изображения типа, и если при нажатии любой картинки (то есть изображения типа) ее видимость должна разрушаться. Теперь нормальный способ сделать это - написать код для краха для каждого события «Click» для каждого изображения.
Есть ли альтернативный способ, чтобы приложение могло понять, что всякий раз, когда нажимается какой-либо UIelement (изображение) изображения типа, тогда этот конкретный элемент (изображение) должен разрушаться?
Я хочу уменьшить код, как я могу это достичь?Как написать обычный обработчик событий для UIElement того же типа?
ответ
Вы можете воспользоваться тем фактом, что эти перенаправленные события, и установить single handler on a parent element.
Это позволяет одному обработчику событий обрабатывать все события дочерних элементов управления. Свойство события OriginalSource
события args предоставит клиенту UIElement, если, например, вы подписались на UIElement.MouseLeftButtonDown
или подобное «общее» событие.
Это можно сделать, добавив в ваш XAML, в контейнере:
<Grid UIElement.MouseLeftButtonDown="CommonClickHandler">
<!-- Your elements here -->
Затем в коде позади:
private void CommonClickHandler(object sender, MouseButtonEventArgs e)
{
Image picture = e.OriginalSource as Image; //OriginalSource is the original element
if (picture != null)
picture.Visibility = Visibility.Collapsed;
}
Вы можете зарегистрировать метод, который вы используете на нескольких обработчиках событий, и получить доступ к определенному элементу управления с помощью параметра Object sender
и передать его типу управления, которым вы пользуетесь.
myControl.Click += new EventHandler(myGenericClickMethod);
public void myGenericClickMethod(Object sender, EventArgs e)
{
Image myImage = (Image) sender;
myImage..Visibility = System.Windows.Visibility.Collapsed;
}
Удовлетворительно ela борат с примером? –
обновлен, чтобы показать пример. –
Вы можете добавить глобальный обработчик с помощью EventManager.RegisterClassHandler like this -
public MainWindow()
{
InitializeComponent();
EventManager.RegisterClassHandler(typeof(Image), Image.MouseDownEvent,
new RoutedEventHandler(OnMouseDown));
}
private void OnMouseDown(object sender, RoutedEventArgs e)
{
(sender as Image).Visibility = System.Windows.Visibility.Collapsed;
}
Это работает отлично! У меня есть вопрос, хотя, что мне делать, если я хочу, чтобы одна картина функционировала по-другому от остальных? –
У вас есть «отправитель» в вашем обработчике. Вы можете проверить имя изображения или другое свойство там и выполнить свою работу для изображения, которое нужно обрабатывать специально. –
Я все еще получаю C#, не могли бы вы привести пример с коротким кодом? –
@ Sidsec9 Добавлены образцы кода –
Это решение работает ближе всего к тому, что я хотел! Почему вы выбрали MouseButtonEventArgs через RoutedEventArgs? Какая у него польза? –