Прикрепленные свойства - PullRequest
       3

Прикрепленные свойства

4 голосов
/ 22 августа 2011

Я немного растерялся из-за свойств, связанных с WPF.Когда вы используете присоединенное свойство, это свойство может быть прочитано и использовано только тем классом, который определяет его правильно?Например, если я хотел использовать какое-либо вложенное свойство в качестве цвета наведения на кнопке, могу ли я получить значение присоединенного свойства из шаблона кнопки и смогу ли я получить доступ к присоединенному свойству из кнопки, чтобы установить цвет пылесоса?

Ответы [ 2 ]

12 голосов
/ 22 августа 2011

Добавление к ответу из HB, используя пример:

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

Да, вы точно можете.Допустим, у вас есть свойство Attached с именем HoverBrush, определенное в классе с именем SomeClass, вы можете установить значение в экземпляре и привязать его к шаблону

<StackPanel>
    <StackPanel.Resources>
        <ControlTemplate x:Key="MyButtonTemplate" TargetType="{x:Type Button}">
            <Border x:Name="border" Background="Gray">
                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter TargetName="border"
                            Property="Background"
                            Value="{Binding RelativeSource={RelativeSource TemplatedParent},
                                            Path=(local:SomeClass.HoverBrush)}"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </StackPanel.Resources>
    <Button Content="Blue Hover"
            local:SomeClass.HoverBrush="Blue"
            Template="{StaticResource MyButtonTemplate}"/>
    <Button Content="Green Hover"
            local:SomeClass.HoverBrush="Green"
            Template="{StaticResource MyButtonTemplate}"/>
</StackPanel>

Соответствующее свойство в вопросе определеноэто

public class SomeClass
{
    public static DependencyProperty HoverBrushProperty =
        DependencyProperty.RegisterAttached("HoverBrush",
                                            typeof(Brush),
                                            typeof(SomeClass),
                                            new PropertyMetadata(null));
    public static void SetHoverBrush(DependencyObject obj, Brush value)
    {
        obj.SetValue(HoverBrushProperty, value);
    }
    public static Brush GetHoverBrush(DependencyObject obj)
    {
        return (Brush)obj.GetValue(HoverBrushProperty);
    }
}
10 голосов
/ 22 августа 2011

Вы прочитали обзор ?Если нет, то сделайте это.

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

Каждый элемент управления имеет свой собственный словарь ключей свойств и значений, а присоединенное свойство позволяет записывать значениеэти словари, использующие новый ключ.Поскольку эти словари независимы, они могут иметь отдельные значения для одного и того же свойства, которое устанавливается и доступно через объявление свойства статического поля.

Поскольку эти свойства прикреплены, вам придется получать значения через GetValue (поскольку классы сами не могут предоставить оболочку CLR).

...