所以,大家好。
我已经制作了两个测试程序来创建自己的控件。一个在 Silverlight 中,一个在 WPF 中。我创建了一种 RangeSlider。这个滑块当然有两个方向,水平和垂直。首先,我使用了两种不同的技术来创建我的 RangeSlider。在 WPF 中我使用了触发器,在 Silverlight 中(你知道没有触发器)我在 CodeBehind.This 运行中更改了水平和垂直模板的可见性。
现在:我正在尝试对 Silverlight 和 WPF 使用一种技术。因此我使用 VisualStateManager。
我有一个定义两个滑块的模板(一个用于左值,另一个用于右值)。简化后的重要值如下所示:
...
<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 可以在水平和垂直外观之间切换:
<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>
这仍然运行。
正如您在代码序列中看到的,Slider 的视觉效果是由模板定义的,这里是 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?
我希望我能很好地解释我的问题,并且有人知道我可以寻找的解决方案或关键字。只是在 google 中输入关键字 VSM、ControlTemplate、Storyboard 等并没有帮助。
提前致谢。