所以,大家好。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垂直与水平的外观之间切换。
正如你在代码序列看,视觉滑块是由模板定义,这里HorizontalSliderTemplate(我再次减少代码):
<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等,不会有任何帮助。
在此先感谢。
啊,是的。我不打算切换垂直和水平模板:D当然,我这样做。对不起,这是我为了更好清晰而遗漏的代码序列之一。但是它是相反的:( – Em1 2011-06-02 21:26:52
所以,我的意思是,在水平(也是垂直)模板中,我想切换内部的元素(如轨道,拇指,重复按钮),而这在上面的VSM中是不可能的码。 – Em1 2011-06-02 21:28:39