Как переопределить свойства зависимостей в универсальном классе? - PullRequest
4 голосов
/ 02 февраля 2012

Итак, у меня есть класс;Давайте использовать класс ScrollViewer в качестве примера.У него есть свойство зависимости, называемое Content, которое принимает что-либо типа System.Object, отлично!

Допустим, я извлекаю класс из ScrollViewer, давайте назовем его ZoomScrollViewer, он добавляет некоторое базовое масштабирование ипанорамирование с помощью мыши с помощью клавиатуры.Он также добавляет свое собственное свойство зависимости, AutoscaleContent.

Теперь я хочу иметь возможность поместить ZoomScrollViewer в окно пользовательского интерфейса, но я только хочу егопринять холст как его содержание.Естественно, я собираюсь создать класс ZoomScrollViewer<T>.

Однако как я могу изменить свойство Content, чтобы оно принимало только элементы типа <T>?Могу ли я переопределить свойство зависимости?Я немного запутался и попробовал:

    public new T Content
    {
        get { return (T)base.Content; }
        set { base.Content = value; }
    }

Но, конечно, это больше не делает его свойством зависимости, поэтому весь код XAML завершается ошибкой, когда я устанавливаю привязки.

Редактировать:Следует также отметить, что я взглянул на использование:

ZoomScrollViewer.ContentProperty.OverrideMetadata(typeof(ZoomScrollControl2<T>), new PropertyMetadata(...?));

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

Обновление: я сейчас попробовал использовать следующее:

public class ZoomScrollControl2<T> : ZoomScrollViewer where T : FrameworkElement
{
    static ZoomScrollControl2()
    {
        ContentProperty.OverrideMetadata(typeof(ZoomScrollControl2<T>), new FrameworkPropertyMetadata(typeof(ZoomScrollControl2<T>)));
    }
}

public class CanvasZoomControl : ZoomScrollControl2<Canvas>
{
}

Что, как я думал, будет работать, но все равно кажется, что он принимает Контент любого типа.

Обновление: Короче говоря, я не уверен, возможно ли то, что я хочу сделать, поэтому я пометил обсуждение как ответ, хотя это и не ответ как таковой.

1 Ответ

2 голосов
/ 02 февраля 2012

Я предлагаю попробовать этот подход, как это предложено этой статьей MSDN.

Это должно переопределить реферальный тип, чтобы вы могли ссылаться на него, используя производный тип.

Dependency Property видимость не сделана явной в .NET Framework для производных типов, поскольку поиск правильного свойства среди дерева типов имеет стоимость с точки зрения производительности, и учитывая, что мы используем DP для привязки пользовательского интерфейса,это может привести к нежелательным проблемам с производительностью.

...