0

所以,大家好。

我已经制作了两个测试程序来创建自己的控件。一个在 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 的视觉效果是由模板定义的,这里是 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?

我希望我能很好地解释我的问题,并且有人知道我可以寻找的解决方案或关键字。只是在 google 中输入关键字 VSM、ControlTemplate、Storyboard 等并没有帮助。

提前致谢。

4

2 回答 2

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>
于 2011-06-01T15:15:57.983 回答
0

所以,我得到了解决方案。在“内部”模板中,我添加了要切换 DataTrigger 的元素。此 DataTrigger 绑定到 PART_Horizo​​ntalTemplate Visibility 并包含执行我需要的操作的情节提要。

也许这不是我真正想要的那种解决方案,因为它会大大扩展代码并使其看起来更复杂。但是 - 这也是最重要的 - 它运行良好。

于 2011-06-03T09:45:17.683 回答