Я начинаю изучать 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"/>
ОЧЕНЬ БОЛЬШОЙ СПАСИБО!!!
Честно говоря, я не вижу ничего плохого в коде, который вы опубликовали. Возможно, объяснение того, что вызывает ошибку, которую вы видите, может дать вам некоторые подсказки, которые вы можете использовать.
Регистрация свойства 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() { }