【问题标题】:WPF Template Binding in ToggleButton UserControlToggleButton UserControl 中的 WPF 模板绑定
【发布时间】:2008-12-12 15:00:24
【问题描述】:

我正在开发一个基本的 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

默认的 Gray 和 LightGray 显示在 VS2008 设计器和编译的应用程序中,但是当我在我的窗口中执行这样的操作时:

<app:DipSwitchToggleBtn x:Name="DipSwitchTest" SwitchColor="#0000FF" SwitchBkgndColor="#000000" />

我为此实例指定的颜色没有被使用。一切编译都没有错误,但我的控件仍以默认颜色显示。

我相信有一些新的层次结构在起作用,因为我将我的项目嵌套在 ToggleButton 中。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 您能否解决此问题?我现在遇到了完全相同的问题,不知道我做错了什么!
  • 是的,和上面一样!想通了吗?

标签: wpf user-controls dependency-properties


【解决方案1】:

在您的颜色属性的吸气剂中,您需要将其转换为画笔

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

它可能没有什么不同,因为它可能只是自动转换,但请尝试一下。

【讨论】:

  • 抱歉,刚试了下,没有任何变化。在我之前的尝试中,上面的 DependencyProperty 代码与不同的 XAML 完美配合。
  • 嗯,那我不知道。其余代码对我来说看起来不错,但我对这些东西还是很陌生。
【解决方案2】:

查看Custom UserControl Property used by child element的答案。相同的概念可以应用于您的 ToggleButton。创建没有内容的 UserControl 只是一个 UserControl.Template 覆盖并使用 TemplateBinding 来设置你的道具

【讨论】:

  • 我尝试了类似于您引用的其他帖子中的示例。不幸的是,由于某种原因,我的动画触发器无法访问我的自定义“State”属性,这就是我尝试使用基于 ToggleButton 的控件的原因,我可以在其中访问 IsChecked 以获取我的动画。也许我会发布一个新问题
猜你喜欢
  • 2014-04-30
  • 1970-01-01
  • 2021-07-19
  • 2011-06-25
  • 2010-12-04
  • 2011-06-05
  • 2011-04-15
  • 2015-11-29
  • 1970-01-01
相关资源
最近更新 更多