1

J'essaie de créer une zone de liste déroulante personnalisée qui affiche une animation de chargement lorsqu'une propriété booléenne est définie dessus (par exemple, IsLoading).GoToState ne fonctionne pas sur controlercoated control sur la base de la zone de liste modifiable

J'ai créé un modèle de contrôle dans Blend en fonction de la liste déroulante et ajouté un bloc de texte à l'intérieur du modèle togglebutton. Dans le code derrière j'appelle VisualStateManager.GoToState mais il renvoie toujours faux. J'essayais initialement de passer à un état personnalisé, mais je ne peux même pas passer à des états tels que Disabled ou MouseOver.

J'ai un contrôle utilisateur qui contient juste une liste déroulante et le style est défini sur mon style combobox contenant le modèle de contrôle. Je suppose que GoToState échoue parce que l'état n'est pas sur le contrôle lui-même, mais à l'intérieur de la combobox. Comment puis-je accéder à cela?

Je ne sais pas comment déboguer cela car il n'y a pas d'erreurs.

merci

Répondre

0

J'ai eu un problème similaire! J'ai eu les états visuels définis dans une grille dans le ControlTemplate.

 <Style x:Key="Image3TextRowButtonStyle" TargetType="Button"> 
     <Setter Property="Foreground" Value="{StaticResource ForegroundBrush}"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button"> 
        <Grid x:Name="RootGrid" Background="{StaticResource BackgroundBrush}"> 
         ... 
         <VisualStateManager.VisualStateGroups> 
          ... 
          <VisualStateGroup x:Name="ActiveStates"> 
           <VisualState x:Name="Active"> 
            <Storyboard> 
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background)" Storyboard.TargetName="RootGrid"> 
              <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackgroundActiveBrush}"/> 
             </ObjectAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="NotActive" /> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Et le contrôle de l'utilisateur:

<UserControl x:Class="Griesser.Presentation.ContactCenterClient.Client.Control.Image3TextRowButtonUC" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     x:Name="Image3TextRowButton"> 

<Grid> 
    <Button x:Name="btn" Command="{Binding Command, ElementName=Image3TextRowButton}" Style="{StaticResource Image3TextRowButtonStyle}" /> 
</Grid> 

Dans le code derrière je suis à la recherche d'abord pour le RootGrid puis utilisez GoToElementState:

 private void ChangeVisualActiveState(bool useTransitions) 
    { 
     // Search RootGrid, because the Visual States are defined in the ControlTemplate! 
     FrameworkElement dt = btn.Template.FindName("RootGrid", btn) as FrameworkElement; 

     if (IsActive) 
     { 
      VisualStateManager.GoToElementState(dt, "Active", useTransitions); 
     } 
     else 
     { 
      VisualStateManager.GoToElementState(dt, "NotActive", useTransitions); 
     } 
    } 
Questions connexes