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 (또는 사용자가 작성하는 [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>