2009-11-06 5 views
1

J'ai un curseur et un contrôle d'étiquette. Le texte est affiché sur l'étiquette (quelques paragraphes).Interaction de contrôle de curseur et d'étiquette/bloc de texte - WPF

  1. J'ai besoin de montrer seulement 3 mots à la fois. Chaque 1 seconde, passer à la prochaine série de 3 mots.
  2. Le curseur est utilisé pour sélectionner le nombre de mots visibles à la fois. Ainsi, un utilisateur peut l'augmenter pour dire 10 et maintenant toutes les secondes, un ensemble de 10 mots doit être affiché.

Comment pourrais-je obtenir ce comportement dans WPF? Je sais que je dois faire une sorte de liaison de données entre le curseur et une étiquette, mais je ne sais pas comment obtenir l'effet de (1) ou (2).

Toute aide est appréciée!

Répondre

0

Voici comment je le résoudre sans utiliser mon {edf: ExpressionBinding} fonction (qui, hélas, ne sont pas encore disponibles au public):

Étape 1: Créer trois DependencyProperties (pas les propriétés traditionnelles NET) dans votre classe:

Text 
WordsPerGroup 
GroupToShow 

Étape 2: Lier le curseur à la propriété "WordsPerGroup":

<Slider ... Value="{Binding WordsPerGroups}" /> 

Etape 3: Création d'une animation à l'aide d'un LinearInt32KeyFrame à animer le « GroupToShow » propriété qui compte une fois par seconde et dure aussi longtemps que vous le souhaitez, par exemple, cela dure 1 heure et compte 3600:

<Int32AnimationUsingKeyFrames Storyboard.TargetProperty="GroupToShow" ...> 
    <LinearInt32KeyFrame KeyTime="01:00:00" Value="3600" /> 
<Int32AnimationUsingKeyFrames> 

Étape 4: Créer un convertisseur qui prend « Texte », " GroupToShow » et "WordsPerGroup" et renvoie le texte à afficher:

public SelectWordsConverter : IMultiValueConverter 
{ 
    public object ConvertTo(object [] values, ...) 
    { 
    string text = values[0] as string; 
    int groupToShow = values[1] as int; 
    int wordsPerGroup = values[2] as int; // maybe double, depending on slider binding 

    return 
     string.Join(" ", 
     text 
     .Split(" ", StringSplitOptions.RemoveEmptyEntries) 
     .Skip(groupToShow * wordsPerGroup) 
     .Take(wordsPerGroup) 
    ); 
    } 
    ... 

Étape 5: Utilisez un MultiBinding pour lier la propriété Text du TextBlock en utilisant votre convertisseur:

<TextBlock ...> 
    <TextBlock.Text> 
    <MultiBinding Converter="{x:Static local:SelectWordsConverter.Instance}"> 
     <Binding Path="Text" /> 
     <Binding Path="GroupToShow" /> 
     <Binding Path="WordsPerGroup" /> 
    </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

Étape 6: Assurez-vous de démarrer votre animation au chargement, ou à chaque fois que vous voulez que l'animation commence à bouger.

Étape 7: (facultatif) Ajoutez un PropertyChangedCallback à "GroupToShow" pour détecter quand les mots ont tous été affichés et faire quelque chose de approprié (par exemple, recommencer ou arrêter l'animation).

+0

Merci! Je suppose que je aboyais le mauvais arbre. Je cherchais à l'implémenter en utilisant le multithreading dans lequel l'utilisateur déplacerait le curseur, le thread ferait un BeginInvoke pour mettre à jour l'interface utilisateur. Cela semble être une façon différente de le faire. Toute aide sur où je peux lire sur ce truc? – Nick

+0

Un livre auquel se référer est le livre d'Adam Nathan, Windows Presentation Foundation Unleashed. Lisez la couverture pour couvrir. Il y a aussi beaucoup de blogs et de questions sur StackOverflow qui peuvent vous donner des idées. Téléchargez des applications et des bibliothèques WPF avec le code source et voyez comment ils font les choses. Regardez les modèles intégrés pour voir comment ils fonctionnent (utilisez Reflector avec le complément BamlViewer). Ce seraient mes recommandations. –

+0

Hey .. j'ai oublié de demander .. le code lié au curseur est-il manquant? – Nick

Questions connexes