2011-06-01 64 views
0

所以,大家好。Silverlight和WPF:ControlTemplate中的VisualStateManager不起作用

我做了两个测试程序来创建自己的控件。一个在Silverlight中,一个在WPF中。我创造了一种RangeSlider。这个滑块当然有两个方向,水平和垂直。我首先使用了两种不同的技术来创建我的RangeSlider。在WPF中,我使用了Silverlight中的触发器(你知道那里没有触发器),我改变了CodeBehind中水平和垂直模板的可见性。

现在: 我想为Silverlight和WPF都使用一种技术。因此我使用VisualStateManager。

我有一个模板定义两个滑块(一个用于左值,另一个用于右值)。简化它看起来像的重要价值:

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup> 
    <VisualState x:Name="Vertical"> 
     <Storyboard> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_HorizontalTemplate" 
             Storyboard.TargetProperty="Visibility"> 
      <DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" KeyTime="0"/> 
     </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
    </VisualState> 
    <VisualState x:Name="Horizontal" /> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

这仍然运行:

... 
<ControlTemplate> 
    <Grid x:Name="PART_Content"> 
    <!-- VSM: See following code sequence --> 
    <Grid x:Name="PART_HorizontalTemplate"> 
     <Slider x:Name="PART_HorizontalSliderLeft" 
       Template="{StaticResource HorizontalSliderTemplate}" 
       Orientation="{TemplateBinding Orientation}" /> 
     ... 
    </Grid> 
    <Grid x:Name="PART_VerticalTemplate"> 
     ... 
    </Grid> 
    </Grid> 
</ControlTemplate> 

此外,还有的VSM垂直与水平的外观之间切换。

正如你在代码序列看,视觉滑块是由模板定义,这里Horizo​​ntalSliderTemplate(我再次减少代码):

<ControlTemplate x:Key="HorizontalSliderTemplate" TargetType="{x:Type Slider}"> 
    <Border x:Name="Border" ...> 
    <!-- VSM here. Like above. --> 
    <Grid x:Name="Grid"> 
     <Rectangle x:Name="PART_SelectionRange"/> 
     <Track x:Name="PART_Track"> 
     ... 
     </Track> 
    </Grid> 
    </Border> 
</ControlTemplate> 

其实也有一个VerticalSliderTemplate。 但我想将两个ControlTemplate结合到一个模板中并使用VSM。这里我们来看看我的问题:

我没有在'内部'ControlTemplate中运行VSM。它与运行的VSM-Part几乎相同,只是TargetName被更改。我不知道如何调试GoToState上正在运行的内容,但我相信模板中的VSM永远不会被发现,并且永远不会执行。

我可以想象,只有一点细节缺失,但我不能看到树木的木材。也许有一件重要的事情我不知道关于模板或VSM,而我不在赛道上。 或者我必须从外部触发“内部”VSM,还是有可能从“VSM外部”访问元素? 或者“内部”模板中的VSM没有访问权限吗?

我希望我能够很好地解释我的问题,并且有人知道解决方案或者我可以找到的关键字。只需在谷歌输入关键字VSM,ControlTemplate,Storyboard等,不会有任何帮助。

在此先感谢。

回答

0

所以,我得到了一个解决方案。 在我要添加到要切换DataTrigger的元素的'inner'模板中。此DataTrigger绑定到PART_Horizo​​ntalTemplate可见性,并包含一个可以执行我需要的操作的Storyboard。

也许这不是我寻找的解决方案,因为它延伸了很多代码,因此看起来更复杂。但是 - 这是最重要的 - 它运行良好。

0

我不认为你可以在一个ControlTemplate中有多个VSM。

为什么不使用一个VSM切换两者。

<ControlTemplate> 
    <Grid x:Name="PART_Content"> 
    <Grid x:Name="PART_HorizontalTemplate"> 
     ... 
    </Grid> 
    <Grid x:Name="PART_VerticalTemplate"> 
     ... 
    </Grid> 
<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup> 
    <VisualState x:Name="Vertical"> 
     <Storyboard> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_HorizontalTemplate" 
             Storyboard.TargetProperty="Visibility"> 
      <DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" KeyTime="0"/> 
     </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
    </VisualState> 
    <VisualState x:Name="Horizontal"> 
<Storyboard> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_VerticalTemplate" 
             Storyboard.TargetProperty="Visibility"> 
      <DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" KeyTime="0"/> 
     </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
    </VisualState> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 
    </Grid> 
</ControlTemplate> 
+0

啊,是的。我不打算切换垂直和水平模板:D当然,我这样做。对不起,这是我为了更好清晰而遗漏的代码序列之一。但是它是相反的:( – Em1 2011-06-02 21:26:52

+0

所以,我的意思是,在水平(也是垂直)模板中,我想切换内部的元素(如轨道,拇指,重复按钮),而这在上面的VSM中是不可能的码。 – Em1 2011-06-02 21:28:39