6

私はDataTemplateにいくつかのコントロールを持っています。私はそれを押した状態の動作をコントロールしたいと思います。私は、DataTemplateにVisualStateManagerを配置したところで次のようにしましたが、動作していないようです。私は以下にしようとしていることを理解することは可能だと思います。 DataTemplateタグ内でインラインで行うことは可能ですか?ItemTemplateでDataTemplateのVisualStateを変更することはできますか?

<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> 

答えて

2

短い答えはあなたがターゲットとしているコントロールの種類には、「プレス」の視覚的な状態がないことである - ので、あなたはビジュアルステートマネージャーで任意の状態を参照することができますが、それは問題ではありませんので、コントロールのコードは決してその状態にしません。

コントロールがどのような視覚的状態をサポートしているかは、その定義(TemplateVisualState属性を使用して宣言されています)を参照するか、またはthis section on MSDNを見て確認できます。

ここに行く方法は、「押し込まれた」ビジュアル状態が組み込まれているので、Button(または書き込むのオーバーライド)を使用することです。コントロールテンプレートを作成するだけでよいでしょうそれは後になっているレイアウトやスタイルを提供します。

コントロールのテンプレート(リソースセクション):


編集は、ここでの例です。これは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を使用して、 "Button" などの項目テンプレートを定義

を制御します。

<ItemsControl ItemsSource="{Binding SelectedItems}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Button Template="{StaticResource MyButtonTemplate}" Content="{Binding}" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
関連する問題