Я разрабатываю базовый пользовательский элемент управления DIP-переключателем в качестве упражнения для личного обучения. Первоначально он был настроен так, чтобы вы могли объявить некоторые пользовательские свойства цвета в пользовательском элементе управления, и они будут использоваться для элементов внутри элемента управления.
Однако я недавно обнаружил ToggleButtons и восстановил свой контроль, чтобы воспользоваться ими. С тех пор мои пользовательские свойства цвета (SwitchColor и SwitchBkgndColor) больше не работают должным образом. Они всегда отображаются с цветами по умолчанию, а не с цветами, которые я указывал при помещении их в окно. Вот некоторый код:
<UserControl x:Class="DipSwitchToggleBtn"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:app="clr-namespace:SwitchesApp"
Width="20" Height="40">
<ToggleButton Name="ToggleBtn" IsThreeState="False">
<ToggleButton.Template>
<ControlTemplate>
<Canvas Name="SwitchBkgnd"
Background="{TemplateBinding app:DipSwitchToggleBtn.SwitchBkgndColor}"
>
<Rectangle Name="SwitchBlock"
Fill="{TemplateBinding app:DipSwitchToggleBtn.SwitchColor}"
Width="16" Height="16"
Canvas.Top="22"
Canvas.Left="2"
/>
</Canvas>
<ControlTemplate.Triggers>
<Trigger Property="ToggleButton.IsChecked" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="SwitchBlock"
Duration="00:00:00.05"
Storyboard.TargetProperty="(Canvas.Top)" To="2" />
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="SwitchBlock"
Duration="00:00:00.05"
Storyboard.TargetProperty="(Canvas.Top)" To="22" />
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</ToggleButton.Template>
</ToggleButton>
</UserControl>
... и код позади:
Partial Public Class DipSwitchToggleBtn
Public Property State() As Boolean
Get
Return Me.ToggleBtn.IsChecked
End Get
Set(ByVal value As Boolean)
Me.ToggleBtn.IsChecked = value
End Set
End Property
Public Sub Toggle()
Me.State = Not Me.State
End Sub
#Region " Visual Properties "
Public Shared ReadOnly SwitchColorProperty As DependencyProperty = _
DependencyProperty.Register("SwitchColor", _
GetType(Brush), GetType(DipSwitchToggleBtn), _
New FrameworkPropertyMetadata(Brushes.LightGray))
Public Property SwitchColor() As Brush
Get
Return GetValue(SwitchColorProperty)
End Get
Set(ByVal value As Brush)
SetValue(SwitchColorProperty, value)
End Set
End Property
Public Shared ReadOnly SwitchBkgndColorProperty As DependencyProperty = _
DependencyProperty.Register("SwitchBkgndColor", _
GetType(Brush), GetType(DipSwitchToggleBtn), _
New FrameworkPropertyMetadata(Brushes.Gray))
Public Property SwitchBkgndColor() As Brush
Get
Return GetValue(SwitchBkgndColorProperty)
End Get
Set(ByVal value As Brush)
SetValue(SwitchBkgndColorProperty, value)
End Set
End Property
#End Region
End Class
Серый и LightGray по умолчанию отображаются в конструкторе VS2008 и скомпилированном приложении, но когда я делаю что-то подобное в моем окне:
<app:DipSwitchToggleBtn x:Name="DipSwitchTest" SwitchColor="#0000FF" SwitchBkgndColor="#000000" />
Цвета, которые я указал для этого экземпляра, не используются. Все компилируется без ошибок, но мой элемент управления по-прежнему отображается с цветами по умолчанию.
Я полагаю, что существует некоторая новая иерархия, поскольку я вложил свои элементы в ToggleButton.
Любая помощь будет оценена. Спасибо.