我能否在ItemTemplate中更改DataTemplate的VisualState?

8

我在一个DataTemplate中有一些控件,我想控制它的按下状态行为。我尝试了以下方法,在DataTemplate中加入VisualStateManager,但似乎并没有起作用。我认为下面的代码可以让你理解我想做什么。请问是否能够在DataTemplate标签内联实现这个功能?

<ItemsControl ItemsSource="{Binding Items}">
    ....
    <ItemsControl.ItemTemplate>
        <DataTemplate>
          <Grid ...>
             <VisualStateManager.VisualStateGroups>
                 <VisualStateGroup x:Name="CommonStates">
                     ...
                     <VisualState x:Name="Pressed">
                         <Storyboard>
                             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderThickness" Storyboard.TargetName="GridItemBorder">
                                 <DiscreteObjectKeyFrame KeyTime="0" Value="3"/>
                              </ObjectAnimationUsingKeyFrames>
                         </Storyboard>
                     </VisualState>
                 </VisualStateGroup>
             </VisualStateManager.VisualStateGroups>
             <Border x:Name="Border" ...>
                 ...
             </Border>
          </Grid>
      </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>
1个回答

3
简短的答案是,你所针对的控件类型没有“Pressed”视觉状态。因此,虽然你可以在Visual State Manager中引用任何状态,但这并不重要,因为控件的代码永远不会将其置于该状态。
你可以通过查看控件的定义(使用“TemplateVisualState”属性声明)或查看MSDN上的this section on MSDN来查看控件支持哪些视觉状态。
在这里应该使用“Button”(或者你编写的“[ButtonBase][2]”覆盖),因为它具有“Pressed”视觉状态。你只需要为其编写一个控件模板,提供所需的布局/样式即可。

编辑 这是一个例子:

控件模板(资源部分)。 这是一个用于Button控件的控件模板,但它并不是真正的按钮。我只是利用它来利用“按下”视觉状态功能。

    <ControlTemplate x:Key="MyButtonTemplate" TargetType="Button">
        <Grid>
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="CommonStates">
                    <VisualState x:Name="Pressed">
                        <Storyboard>
                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" Storyboard.TargetName="GridItemBorder">
                                <DiscreteObjectKeyFrame KeyTime="0" Value="3"/>
                            </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
            <Border x:Name="GridItemBorder" BorderBrush="Orange" BorderThickness="1" Background="White">
                <ContentPresenter Content="{TemplateBinding Content}" />
            </Border>
        </Grid>
    </ControlTemplate>

项目控件

将项目模板定义为使用上述ControlTemplate的“按钮”。

    <ItemsControl ItemsSource="{Binding SelectedItems}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Template="{StaticResource MyButtonTemplate}" Content="{Binding}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接