Общий стиль для разных элементов управления с одинаковыми пользовательскими свойствами - PullRequest
1 голос
/ 07 сентября 2011

У меня есть несколько пользовательских элементов управления, которые имеют некоторые общие свойства, и я хотел бы применить общий стиль, который запускается с этими свойствами.Я поместил эти общие свойства в интерфейс (IMyControl) и заставил свои элементы управления реализовать его, но кажется, что стиль не может иметь интерфейс как TargetType ...

Мои пользовательские свойства имеют два логических значения: bMandatory иbIncomplete.Общая часть стиля:

<Style.Triggers>
    <Trigger Property="IsKeyboardFocusWithin" Value="True">
        <Setter Property="Background" Value="{StaticResource FocusedBG}" />
    </Trigger>
    <Trigger Property="bMandatory" Value="True">
        <Setter Property="Background" Value="{StaticResource MandatoryBG}" />
    </Trigger>
    <MultiTrigger>
        <MultiTrigger.Conditions>
            <Condition Property="bMandatory" Value="True" />
            <Condition Property="bIncomplete" Value="True" />
        </MultiTrigger.Conditions>
        <Setter Property="Background" Value="{StaticResource IncompleteBG}" />
    </MultiTrigger>
</Style.Triggers>

Я также вставил в интерфейс IsKeyboardFocusWithin bool и кисть Background , а затем попробовал:

<Style x:Key="ControlRellenableEstilo">
    <Style.Triggers>
        <Trigger Property="local:IMyControl.IsKeyboardFocusWithin" Value="True">
            <Setter Property="local:IMyControl.Background" Value="{StaticResource FocusedBG}" />
        </Trigger>
        <Trigger Property="local:IMyControl.bMandatory" Value="True">
            <Setter Property="local:IMyControl.Background" Value="{StaticResource MandatoryBG}" />
        </Trigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="local:IMyControl.bMandatory" Value="True" />
                <Condition Property="local:IMyControl.bIncomplete" Value="True" />
            </MultiTrigger.Conditions>
            <Setter Property="Background" Value="{StaticResource IncompleteBG}" />
        </MultiTrigger>
    </Style.Triggers>
</Style>

Он не жалуется при сборке, но при запуске приложения выдает исключение XamlParseException, которое сообщает

Не удалось присвоить свойству 'System.Windows.Setter.Value'

указывает на строку: <Setter Property="local:IMyControl.Background" Value="{StaticResource FocusedBG}" />

Имеется внутреннее исключение со следующим сообщением:

Значение не может быть нулевым.Имя параметра: свойство '

Value = "{StaticResource FocusedBG}" работает в остальных моих стилях ... Есть идеи, как я могу решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 07 сентября 2011

Сеттеры работают только с свойствами зависимостей , в интерфейсе вы не можете зарегистрировать их, и они могут быть зарегистрированы только один раз, поэтому даже если вы указываете какое-то поле для них в интерфейсе, которое, вероятно, далекоотличная идея.Возможно, вы захотите использовать вложенные свойства или использовать базовый класс с этим свойством (что, вероятно, не вариант).

0 голосов
/ 07 сентября 2011

Что делать, если вы установите значение по умолчанию для 'local: IMyControl.Background' в стиле также, например:

<Style x:Key="ControlRellenableEstilo">

    <Setter Property="local:IMyControl.Background" Value="Gray" /> 
    <!--or use TemplateBinding to Parent to get suitable color-->

    <Style.Triggers>

        ... skipped ...

    </Style.Triggers>
</Style>

Также проверьте Список приоритетов в вашем CustomControl.

...