2012-08-29 4 views
0

Comme le titre l'indique, je souhaite masquer ou afficher du contenu de manière dynamique. J'ai deux boutons qui fonctionnent comme des boutons radio. Chaque bouton doit afficher un contenu spécifique, mais les deux contenus ne doivent pas être visibles en même temps (c'est une sorte de formulaire, et je travaille sur deux sous-classes).Afficher/afficher dynamiquement le contenu wpf

J'ai vu sur SO deux choses intéressantes, et je voulais les mélanger. Tout d'abord, l'utilisation de ContentControl avec un ToggleButton (http://stackoverflow.com/questions/7698560/how-to-bind-click-of-a-button-to-change-the-content-of-a-panel- grid-using-xaml). Deuxièmement, en utilisant ToggleButtons comme RadioButtons (http://stackoverflow.com/questions/2362641/how-to-get-a-group-of-toggle-buttons-to-act-like-radio-buttons-in-wpf) avec 31)

ai donc décidé de commencer par quelque chose comme ça:

<ContentControl> 
    <ContentControl.Template> 
     <ControlTemplate> 
      <WrapPanel HorizontalAlignment="Center"> 
       <TextBlock Text="{x:Static Internationalization:Resources.MAINOPTIONSWINDOW_STATUSLINKSUPERVISOR}"/> 
       <RadioButton Style="{StaticResource {x:Type ToggleButton}}" Content="Alarm" GroupName="Trigger"/> 
       <RadioButton Style="{StaticResource {x:Type ToggleButton}}" Content="Event" GroupName="Trigger"/> 

      </WrapPanel> 
     </ControlTemplate> 
    </ContentControl.Template> 
</ContentControl> 

Mais Visual studio souligne

{StaticResource {x:Type ToggleButton}} 

visuellement, mes boutons apparaissent comme des boutons radio au lieu des boutons à bascule. visuel dit:

Impossible de résoudre la ressource "{{x StaticResource: Type ToggleButton}}" (traduit du français;))

Quoi qu'il en soit ce code fonctionne très bien en dehors du ContentControl.

Répondre

0

Dans les modèles de contrôle, vous n'ajoutez normalement pas de gestionnaires d'événements. Remplacez le modèle OnApply et ajoutez le gestionnaire à cet emplacement.

1

Oui, tout d'abord, corrigez vos eventHandlers. Ne les attachez pas sur des modèles, des choses délicates peuvent arriver.

Deuxièmement, vous pouvez modifier vos ContentControl.Resources, et de mettre cela là:

<Style BasedOn="{StaticResource {x:Type ToggleButton}}" 
      TargetType="RadioButton"/> 

et supprimer vos propres définitions de style. Vous pouvez même mettre ce niveau plus haut (parent de ContentControl). Une dernière chose, vous le faites en code-behind, mais je peux vous assurer, le vrai pouvoir de WPF provient du fait que vous n'avez pas besoin de code-behind, au moins pour une logique comme celle-ci.

Aussi le lien que vous avez donné, il utilise des déclencheurs. Ce n'est pas un gros problème en ce moment mais vous devriez savoir que ce n'est pas correct. Si vous souhaitez passer d'un contenu à l'autre, consultez ContentControl Content, DataTemplates, DataTemplateSelector. L'idée est d'avoir une seule vue en mémoire, ne pas cacher les choses.

Cela peut rattraper, si vous faites l'inverse. Il finira par ajouter plus de temps au démarrage et à l'utilisation de la mémoire.

0

J'ai finalement trouvé une autre façon

<RadioButton Content="Alarm" GroupName="TriggerStateInfo" Style="{StaticResource {x:Type ToggleButton}}" 
     Command="{x:Static StateInfoTemplateToAlarmCommand}"/> 
<RadioButton Content="Event" GroupName="TriggerStateInfo" Style="{StaticResource {x:Type ToggleButton}}" 
       Command="{x:Static StateInfoTemplateToEventCommand}"/> 
<ContentControl Content="{Binding Path=Trigger, ElementName=Window}"> 
    <ContentControl.Resources> 
     <DataTemplate DataType="{x:Type States:AlarmTrigger}"> 
      <ComboBox ItemsSource="{Binding Path=AlarmTriggersCollection}" /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type States:EventTrigger}"> 
      <ComboBox ItemsSource="{Binding Path=EventTriggersCollection}" /> 
     </DataTemplate> 
    </ContentControl.Resources> 
</ContentControl> 

Avec code sous-jacent changement de type de déclenchement

Questions connexes