Связывание шаблонов WPF в ToggleButton UserControl - PullRequest
2 голосов
/ 12 декабря 2008

Я разрабатываю базовый пользовательский элемент управления 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.

Любая помощь будет оценена. Спасибо.

Ответы [ 2 ]

2 голосов
/ 12 декабря 2008

В получателях ваших цветовых свойств вам нужно преобразовать в кисти

Public Property SwitchBkgndColor() As Brush
    Get
        Return CType(GetValue(SwitchBkgndColorProperty), Brush)
    End Get

    Set(ByVal value As Brush)
        SetValue(SwitchBkgndColorProperty, value)
    End Set
End Property

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

0 голосов
/ 13 декабря 2008

См. Ответ от Пользовательское свойство UserControl, используемое дочерним элементом . Та же концепция может быть применена к вашему ToggleButton. Создайте UserControl без содержимого, только переопределение UserControl.Template и используйте TemplateBinding для установки вашего реквизита

...