6

Mam niektóre kontrole w DataTemplate i chciałbym kontrolować jego wciśnięty stan zachowania. Zrobiłem następujące, gdzie po prostu umieścić VisualStateManager w DataTemplate, ale wydaje się, że nie działa. Myślę, że można zrozumieć, co próbuję zrobić poniżej. Czy można to zrobić wewnątrz znaczników DataTemplate?Czy mogę zmienić VisualState DataTemplate w ItemTemplate?

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

Odpowiedz

2

Krótka odpowiedź jest taka, że ​​nie ma „prasowana” stan wizualny do kontroli typu jesteś kierowania - tak podczas gdy można odwołać się do dowolnego stanu w Visual State Manager to nie będzie miało znaczenia, ponieważ kod kontrolny nigdy nie wprowadzi go w ten stan.

Można sprawdzić, które kraje wizualna kontrola obsługuje patrząc na jego definicji (są one uznane za pomocą atrybutu TemplateVisualState), lub patrząc na this section on MSDN.

W tym miejscu można posłużyć się Button (lub zastąpieniem napisanego [ButtonBase][2]), ponieważ ma wbudowany "Wciśnięty" stan wizualny. Wystarczy napisać dla niego szablon kontrolny który zapewnia pożądane układy/style.


Edit Oto przykład:

sterowania szablon (rozdział zasobów). To jest szablon kontrolny dla kontrolki Button, ale tak naprawdę nie jest to przycisk. Używam go tylko do skorzystania z funkcji "Wciśnięty" stanu wizualnego.

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

Elementy sterowania

Definiowanie szablonu elementu jako "przycisk", który wykorzystuje powyższą ControlTemplate.

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