2008-12-12 148 views
2

我正在开发基本的dip开关用户控件作为个人学习练习。最初,我设置了它可以在用户控件上声明一些自定义颜色属性的位置,并且它们将用于控件中的元素。ToggleButton UserControl中的WPF模板绑定

但是,我最近发现了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 

默认灰色和浅灰色在VS2008设计和编译的应用程序显示出来,但是当我做这样的事情在我的窗口:

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

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

我相信这里有一些新的层次结构,因为我在ToggleButton中嵌套了我的项目。

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

+0

你能解决这个问题吗?我现在遇到完全相同的问题,无法分辨我做错了什么! – Raj 2010-06-21 22:07:20

+0

和上面一样!想通了吗? – M2X 2011-01-12 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 

它可能不会有所作为,因为它可能只是自动转换,但试试看的干将。

+0

对不起,刚试过,但没有改变。上面的DependencyProperty代码在我的早期尝试中与不同的XAML完美配合。 – 2008-12-12 16:13:54