Что мне нужно сделать, чтобы синтаксис элемента свойства работал для моего пользовательского присоединенного свойства в Silverlight? - PullRequest
4 голосов
/ 11 ноября 2008

У меня есть такой класс:

public class Stretcher : Panel {

    public static readonly DependencyProperty StretchAmountProp = DependencyProperty.RegisterAttached("StretchAmount", typeof(double), typeof(Stretcher), null);

    public static void SetStretchAmount(DependencyObject obj, double amount)
    {
        FrameworkElement elem = obj as FrameworkElement;
        elem.Width *= amount;

        obj.SetValue(StretchAmountProp, amount);
    }
}

Я могу установить свойство суммы растяжения в XAML, используя синтаксис атрибута:

<UserControl x:Class="ManagedAttachedProps.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:map="clr-namespace:ManagedAttachedProps"
    Width="400" Height="300">

    <Rectangle Fill="Aqua" Width="100" Height="100" map:Stretch.StretchAmount="100" />

</UserControl>

и мой прямоугольник растянут, но я не могу использовать синтаксис элемента свойства, например так:

<UserControl x:Class="ManagedAttachedProps.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:map="clr-namespace:ManagedAttachedProps"
    Width="400" Height="300">

    <Rectangle Fill="Aqua" Width="100" Height="100">
        <map:Stretcher.StretchAmount>100</map:Stretcher.StretchAmount>
    </Rectangle>
</UserControl>

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

Я знаю, что можно сделать что-то подобное, потому что VisualStateManager это делает. Я пытался использовать типы, отличные от double, и, похоже, ничего не работает.

Ответы [ 2 ]

2 голосов
/ 12 ноября 2008

Я думаю, что понял это, хотя я не совсем уверен, что понимаю причину, по которой это работает.

Чтобы ваш пример работал, мне нужно было создать собственный тип Stretch со свойством StretchAmount. Как только я сделал это и поместил это в теги элемента свойства, это сработало. В противном случае это не называется.

public class Stretch
{
    public double StretchAmount { get; set; }
}

И свойство изменилось на ..

public static readonly DependencyProperty StretchAmountProp = DependencyProperty.RegisterAttached("StretchAmount", typeof(Stretch), typeof(Stretcher), null);

public static void SetStretchAmount(DependencyObject obj, Stretch amount) 
{ 
    FrameworkElement elem = obj as FrameworkElement; 
    elem.Width *= amount.StretchAmount; 
    obj.SetValue(StretchAmountProp, amount); 
}

Чтобы это работало в сценарии, в котором вы не используете элемент свойства, вам нужно создать специальный конвертер типов, чтобы это работало.

Надеюсь, это поможет, хотя и не объясняет, почему я все еще пытаюсь понять.

Кстати - для настоящего тизера мозга взгляните на VisualStateManager в отражателе. Свойство зависимости и установщик для VisualStateGroups оба internal .

1 голос
/ 12 ноября 2008

Итак, решение Брайанта работает, оно требует небольшой модификации XAML:

<Rectangle Fill="Aqua" Width="100" Height="100" x:Name="the_rect">
        <map:Stretcher.StretchAmount>
            <map:Stretch StretchAmount="100" />
        </map:Stretcher.StretchAmount>
</Rectangle>
...