Silverlight с использованием DependencyProperty и ControlTemplate

2

Я начинаю изучать Silverlight 3 и Visual Studio 2008. Я пытаюсь создать гаджет боковой панели Windows с элементами управления кнопками, которые выглядят как круги (у меня есть пара "округлых" png-изображений). Поведение, я хочу, следующее: когда мышь нависает над изображением, он становится немного больше. Когда мы нажимаем на него, он идет вниз и вверх. Когда мы оставим изображение кнопки, он снова станет нормальным.
Потому что у меня будет пара таких элементов управления. Я решил реализовать пользовательский элемент управления: как кнопку, но с изображением и без содержимого. Моя проблема в том, что я не могу установить свои пользовательские свойства в своем шаблоне и стиле.

Что я делаю неправильно?

Мой командный шаблон с тремя дополнительными свойствами:

namespace SilverlightGadgetDocked {  
    public class ActionButton : Button {  
        /// <summary>  
        /// Gets or sets the image source of the button.  
        /// </summary>  
        public String ImageSource {  
            get { return (String)GetValue(ImageSourceProperty); }  
            set { SetValue(ImageSourceProperty, value); }  
        }  
        /// <summary>  
        /// Gets or sets the ratio that is applied to the button size  
        /// when the mouse control is over the control.  
        /// </summary>  
        public Double ActiveRatio {  
            get { return (Double)GetValue(ActiveRatioProperty); }  
            set { SetValue(ActiveRatioProperty, value); }  
        }

        /// <summary>
        /// Gets or sets the offset - the amount of pixels the button 
        /// is shifted when the the mouse control is over the control.
        /// </summary>
        public Double ActiveOffset {
            get { return (Double)GetValue(ActiveOffsetProperty); }
            set { SetValue(ActiveOffsetProperty, value); }
        }

        public static readonly DependencyProperty ImageSourceProperty =
            DependencyProperty.Register("ImageSource",
            typeof(String),
            typeof(ActionButton),
            new PropertyMetadata(String.Empty));

        public static readonly DependencyProperty ActiveRatioProperty =
            DependencyProperty.Register("ActiveRatio",
            typeof(Double),
            typeof(ActionButton),
            new PropertyMetadata(1.0));

        public static readonly DependencyProperty ActiveOffsetProperty =
            DependencyProperty.Register("ActiveOffset",
            typeof(Double),
            typeof(ActionButton),
            new PropertyMetadata(0));

        public ActionButton() {
            this.DefaultStyleKey = typeof(ActionButton);
        }
    }
}

И XAML со стилями:

<UserControl x:Class="SilverlightGadgetDocked.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:SilverlightGadgetDocked="clr-namespace:SilverlightGadgetDocked" 
    Width="130" Height="150" SizeChanged="UserControl_SizeChanged"  MouseEnter="UserControl_MouseEnter" MouseLeave="UserControl_MouseLeave">
    <Canvas>
        <Canvas.Resources>
            <Style x:Name="ActionButtonStyle" TargetType="SilverlightGadgetDocked:ActionButton">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="SilverlightGadgetDocked:ActionButton">
                            <Grid>
                                <Image Source="{TemplateBinding ImageSource}"
                                    Width="{TemplateBinding Width}"
                                    Height="{TemplateBinding Height}"/>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
            <Style x:Key="DockedActionButtonStyle" TargetType="SilverlightGadgetDocked:ActionButton"
                   BasedOn="{StaticResource ActionButtonStyle}">
                <Setter Property="Canvas.ZIndex" Value="2"/>
                <Setter Property="Canvas.Top" Value="10"/>
                <Setter Property="Width" Value="30"/>
                <Setter Property="Height" Value="30"/>
                <Setter Property="ActiveRatio" Value="1.15"/>
                <Setter Property="ActiveOffset" Value="5"/>
            </Style>
            <Style x:Key="InfoActionButtonStyle" TargetType="SilverlightGadgetDocked:ActionButton"
                   BasedOn="{StaticResource DockedActionButtonStyle}">
                   <Setter Property="ImageSource" Value="images/action_button_info.png"/>
            </Style>
            <Style x:Key="ReadActionButtonStyle" TargetType="SilverlightGadgetDocked:ActionButton"
                   BasedOn="{StaticResource DockedActionButtonStyle}">
                <Setter Property="ImageSource" Value="images/action_button_read.png"/>
            </Style>
            <Style x:Key="WriteActionButtonStyle" TargetType="SilverlightGadgetDocked:ActionButton"
                   BasedOn="{StaticResource DockedActionButtonStyle}">
                <Setter Property="ImageSource" Value="images/action_button_write.png"/>
            </Style>
        </Canvas.Resources>
        <StackPanel>
                <Image Source="images/background_docked.png" Stretch="None"/>
                <TextBlock Foreground="White" MaxWidth="130" HorizontalAlignment="Right" VerticalAlignment="Top" Padding="0,0,5,0" Text="Name" FontSize="13"/>
        </StackPanel>
        <SilverlightGadgetDocked:ActionButton Canvas.Left="15" Style="{StaticResource InfoActionButtonStyle}" MouseLeftButtonDown="imgActionInfo_MouseLeftButtonDown"/>
        <SilverlightGadgetDocked:ActionButton Canvas.Left="45" Style="{StaticResource ReadActionButtonStyle}" MouseLeftButtonDown="imgActionRead_MouseLeftButtonDown"/>
        <SilverlightGadgetDocked:ActionButton Canvas.Left="75" Style="{StaticResource WriteAtionButtonStyle}" MouseLeftButtonDown="imgActionWrite_MouseLeftButtonDown"/>
    </Canvas>
</UserControl>

И Visual Studio сообщает, что "Недопустимое значение атрибута ActiveRatio для свойства Property" в строке 27

<Setter Property="ActiveRatio" Value="1.15"/>

ОЧЕНЬ БОЛЬШОЙ СПАСИБО!!!

Теги:
xaml
properties
silverlight
controltemplate

1 ответ

1

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

Регистрация свойства Dependancy - вот что важно здесь: -

    public static readonly DependencyProperty ActiveRatioProperty =
        DependencyProperty.Register("ActiveRatio",
        typeof(Double),
        typeof(ActionButton),
        new PropertyMetadata(1.0));

Это создает и регистрирует экземпляр свойства зависимости от комбинации строки "ActiveRatio" и Type ActionButton. Когда Silverlight приходит, чтобы включить следующий Xaml: -

<Style x:Key="Stuff" TargetType="local:ActionButton">
  <Setter Property="ActiveRatio" Value="1.15" />
</Style>

он объединяет тип, указанный в атрибуте TargetType стиля, с строкой в ​​атрибуте seters Property, чтобы найти экземпляр свойства зависимостей. * Затем он может использовать тип, указанный свойством dependency, для преобразования строки в атрибуты seters Value. Наконец, он может вызвать SetValue на FrameworkElement, на котором установлен стиль, передавая найденный DependencyProperty и преобразованное значение.

Теперь верните * в предыдущем абзаце. На этом этапе код не удался. Он не может найти регистрацию свойств зависимостей для строки "ActiveRatio" и типа ActionButton.

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

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

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

 public static ActionButton() { }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню