Связывание шаблона WPF в ToggleButton UserControl

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

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

12.12.2008 15:00:24
Удалось ли вам решить эту проблему? Я сталкиваюсь с той же самой проблемой прямо сейчас и не могу сказать, что я делаю неправильно!
Raj 21.06.2010 22:07:20
Да, как и выше! Разобрался еще?
Maghoumi 12.01.2011 20:36:36
2 ОТВЕТА

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

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

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

2
12.12.2008 15:52:05
Извините, только что попробовал, но без изменений. Приведенный выше код DependencyProperty прекрасно работал с другим XAML в моей предыдущей попытке.
Ben Brandt 12.12.2008 16:13:54
Хм, тогда я не знаю. Остальная часть кода выглядит хорошо для меня, но я все еще довольно новичок в этом.
Bryan Anderson 12.12.2008 16:20:09

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

0
23.05.2017 12:00:16
Я попробовал что-то вроде примера из моего другого поста, на который вы ссылались. К сожалению, по каким-то причинам мои триггеры анимации не смогли получить доступ к своему пользовательскому свойству «Состояние», поэтому я попробовал элемент управления на основе ToggleButton, где я мог получить доступ к IsChecked для своих анимаций. Возможно я отправлю новый вопрос
Ben Brandt 12.12.2008 21:47:29