7

DataTemplateにいくつかのコントロールがあり、押された状態の動作を制御したいと思います。VisualStateManagerをDataTemplateに配置したところ、次のことを行いましたが、機能していないようです。以下で私がやろうとしていることを理解することは可能だと思います。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>
4

1 に答える 1

2

簡単に言うと、ターゲットとするコントロールタイプには「押された」視覚的状態がないため、Visual State Managerで任意の状態を参照できますが、コントロールのコードがそれを配置することはないため、問題ではありません。その状態に。

コントロールがサポートするビジュアル状態は、その定義(TemplateVisualState属性を使用して宣言されている)を確認するか、MSDNのこのセクションを確認することで確認できます。

ここに行く方法は、「押された」視覚状態が組み込まれているので、(またはあなたが書いButtonたもののオーバーライド)を使用することかもしれません。レイアウト/スタイルを提供するコントロールテンプレートを書く必要があります[ButtonBase][2]あなたが求めていること。


編集ここに例があります:

コントロールテンプレート(リソースセクション)。 これはコントロールのコントロールテンプレートですが、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>
于 2012-11-22T02:50:24.740 に答える