Решение, которое мы придумали, состояло в том, чтобы просто создать подкласс Canvas, а затем следить за детьми.Если добавляется не тот тип, который нам нужен, мы немедленно удаляем его и выдаем ошибку.Не остановит ошибки во время компиляции, но сделает свое дело.
Расширяя это далее, я думал также о создании подкласса холста, а затем обмениваясь свойством Children для возврата нашей собственной коллекции, которую мы внутренне синхронизировали сдети панели через связывание.Таким образом, мы также можем получить поддержку во время компиляции.Конечно, если кто-то преобразует наш подкласс в прямой холст, то очевидно, что свойство 'new'd Children' не будет доступно (это 'new', а не переопределение), но вышеупомянутый мониторинг коллекции все равно даст нам то, что мы хотим.
Было бы было бы хорошо, если бы команда WPF придумала общий холст, чтобы мы могли сделать что-то вроде холста, но это явно не сработало бы в XAML, если бы они как-то не придумали синтаксис длятот.Опять же, холст чертовски простой, так что, может быть, мы просто выпустим нашу собственную оригинальную версию, где мы могли бы сделать что-то вроде этого ...
public class TypedCanvas<t> : PanelBase
{
// Implementation here
}
public class FooCanvas : TypedCanvas<Foo>{}
public class LaaCanvas : TypedCanvas<Laa>{}
... из которых мы могли бы , затем используйте FooCanvas и LaaCanvas через XAML, при этом все еще получая все преимущества использования дженериков.
Еще лучше, сделайте его TypedPanelBase, чтобы мы могли использовать его с любой другой пользовательской панелью в качестве базового типа.
На самом деле, теперь, когда я набрал это ... Я думаю, что я собираюсь переписать наш холст, чтобы попробовать этот подход!(В любом случае, теперь у меня есть решение, к которому мы стремились.)