Заранее прошу прощения за невнятный заголовок, не придумал как лучше объяснить.
Итак, у меня есть набор WPF-control (кастомных, делаю сам).
Нужно, чтобы каждый из них мог как посылать, так и "получать" события, стало быть, напрашивается интерфейс:
public delegate void MyEventHandler(object parameter);
public interface IMyCommand
{
event MyEventHandler OnSend;
event MyEventHandler OnReceive;
}
Вроде как все логично, но нужно знать, кто посылает события, поэтому расширим делегат на тип UserControl:
public enum MyControlType
{
A,
B,
etc..
};
public delegate void MyEventHandler(MyControlType type, object parameter);
И все, опять-таки, логично. Но, так как UserControl'ы - часть WPF приложения, нужно при старте пройти по VisualTree
и подписаться на каждый из них.
Я подумал, что в этом нет ничего сложного (и с точки зрения архитектуры правда нет) - создадим базовый класс или интерфейс, пробежимся по VisualTree, и если тип соответствует - подпишемся.
И вот тут появилась проблема: так как UserControl в WPF - это partial-классы, они не поддерживают multiple inheritance (что, опять-таки, понятно и логично).
Я попытался сделать code trick:
public class MyBaseClass: UserControl
{
}
public partial class MyControl : MyBaseClass
{
}
И это не "жрет" даже VS 2019.
Думаю, ок - мы же можем наследоваться от DependencyObject
и искать по VisualTree
хрестоматийным методом, которые все, кто умеет гуглить, используют:
public IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
yield return (T)child;
foreach (T childOfChild in FindVisualChildren<T>(child))
yield return childOfChild;
}
}
}
Но этот метод выдает Count = 0
Возможно, я изначально не так спроектировал? Буду благодарен любым советам.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
При попытке запуска какой-либо программы через VS выдает такую ошибкуРаньше этого не было, но после обновления ОС на Mac'е началось
Обясните значение каждых скобок при объявлении массива массивов,ведь я понимаю только значение [3],что значит что длина массива - 3А вот почему...
Хочу подключиться к локальному серверу MySQL через приложение C#, но получаю ошибку с первого скрина: named pipes provider error 40