2010-10-10 31 views
2

J'ai un FlowDocument (à l'intérieur d'un RichTextBox) qui contient UIElement contrôles tels que CheckBox es. J'ai besoin à l'utilisateur de pouvoir cliquer sur le CheckBox pour le sélectionner pour modifier les propriétés de contrôle telles que l'étiquette, la couleur d'arrière-plan, etc.Sélectionnez un UIElement WPF dans un FlowDocument

Le problème que j'ai est que quand je clique dessus il ne vérifie ou désactive l'CheckBox comme vous vous y attendriez. Comment aurais-je le CheckBox afficher une bordure autour d'elle-même lorsque l'on clique dessus et ne pas modifier la valeur vérifiée. Rendre la propriété IsEnabled false signifie que je ne peux même pas accéder au contrôle, il n'est pas reconnu.

Je suppose que l'explication la plus simple de ce que j'essaie d'obtenir est similaire à Expression Blend ou Visual Studio Visual Designer. Lorsque l'utilisateur clique sur un CheckBox, il est sélectionné, plutôt que de basculer la valeur cochée.

J'ai essayé de chercher partout mais je ne sais pas dans quelle direction aller. Toute aide serait appréciée.

Répondre

0

Cette réponse n'est pas satisfaisante, mais en plus de construire un ControlTemplate personnalisé, ce fut le plus facile (quoique probablement le plus moche) à faire.

En supposant que nous avons un CheckBox sous le nom de « eins » nous utiliserions 3 événements pour déterminer ses états:

public void eins_Click(object sender, RoutedEventArgs e) 
    { 
     var _sender = sender as CheckBox; 
     if (_sender.Tag == null || _sender.Tag.ToString() != "pressedOnce") 
     { 
      _sender.Tag = "pressedOnce"; 
      _sender.IsChecked = false; 


      testStack.Children.Remove(_sender); 

      Border border = new Border() 
      { 
       BorderThickness = new Thickness(2), 
       BorderBrush = new SolidColorBrush(Colors.Cyan), 
      }; 
      border.Child = _sender; 
      testStack.Children.Insert(0, border); 
     } 

     else 
     { 
      _sender.IsChecked = true; 
     } 
    } 

    private void eins_LostFocus(object sender, RoutedEventArgs e) 
    { 
     var _sender = sender as CheckBox; 
     _sender.Tag = ""; 
     var border = _sender.Parent as Border; 
     border.Child = null; 
     testStack.Children.Remove(border); 
     testStack.Children.Insert(0,_sender); 
    } 

    private void eins_Checked(object sender, RoutedEventArgs e) 
    { 
     DispatcherTimer timer = new DispatcherTimer() 
     { 
      Interval = new TimeSpan(0,0,1) 
     }; 
     timer.Tick += new EventHandler(timer_Tick); 
     timer.Start(); 
    } 

    void timer_Tick(object sender, EventArgs e) 
    { 
     if (eins.IsChecked == true) 
     { 
      //do whatever you want to do 
     } 
    } 

Maintenant, ce qui est plus d'une solution de contournement et présente plusieurs inconvénients:

1) vous devez être sûr que la boîte n'est jamais vérifiée pendant plus de 1 seconde, sinon vous devez augmenter le TimeSpan
2) Vous devez toujours savoir quel type de contrôle est le parent réel de la Checkbox
3) Vous auriez besoin pour finir de vérifier bugs, cela ne fonctionnera probablement pas hors de la boîte
4) Ce n'est pas vraiment construit pour la performance

+1

La réponse (que j'ai trouvée depuis) ​​est d'utiliser des ornements. Ils sont conçus exactement à cet effet. Juste besoin de creuser dans eux plus que je n'ai pas beaucoup d'expérience avec eux pour le moment. – dgwyer

+0

Je vais probablement devoir creuser dans ceux-là aussi. :) Merci pour le heads-up – Semyazas

+0

Dessiner des ornements sur flowdocs? –