Comment rendre un paragraphe pliable dans un FlowDocument tout en conservant son texte sélectionnable?Comment faire pour réduire un paragraphe?
4
A
Répondre
1
Ceci doit être l'une des extensions les plus laides jamais (en termes de code et visuels), mais il "rend un paragraphe collabsible" et le texte est encore sélectionnable.
public static class ParagraphExtensions
{
private static Dictionary<Paragraph, InlineUIContainer> _collapseButtonDictionary;
private static Dictionary<Paragraph, List<Inline>> _paragraphInlineStorage;
public static readonly DependencyProperty IsCollapsibleProperty =
DependencyProperty.RegisterAttached("IsCollapsible", typeof(bool), typeof(Paragraph), new UIPropertyMetadata(false, IsCollapsibleChanged));
public static bool GetIsCollapsible(DependencyObject obj)
{
return (bool)obj.GetValue(IsCollapsibleProperty);
}
public static void SetIsCollapsible(DependencyObject obj, bool value)
{
obj.SetValue(IsCollapsibleProperty, value);
}
private static void IsCollapsibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (_collapseButtonDictionary == null) _collapseButtonDictionary = new Dictionary<Paragraph, InlineUIContainer>();
if (_paragraphInlineStorage == null) _paragraphInlineStorage = new Dictionary<Paragraph, List<Inline>>();
Paragraph p = sender as Paragraph;
if ((bool)e.NewValue)
{
InlineUIContainer container;
if (_collapseButtonDictionary.ContainsKey(p))
{
container = _collapseButtonDictionary[p];
}
else
{
ToggleButton button = new ToggleButton() { Tag = p, Content = "Hide" };
container = new InlineUIContainer() { Child = button };
_collapseButtonDictionary.Add(p, container);
button.Click += new RoutedEventHandler(CollapseButton_Click);
}
if (p.Inlines.Count > 0)
{
p.Inlines.InsertBefore(p.Inlines.First(), container);
}
else
{
p.Inlines.Add(container);
}
}
else
{
if (_collapseButtonDictionary.ContainsKey(p))
{
var container = _collapseButtonDictionary[p];
var tb = container.Child as ToggleButton;
if ((bool)tb.IsChecked) SetCollapsedState(false, p);
p.Inlines.Remove(container);
_collapseButtonDictionary.Remove(p);
}
}
}
private static void CollapseButton_Click(object sender, RoutedEventArgs e)
{
ToggleButton button = sender as ToggleButton;
var p = button.Tag as Paragraph;
SetCollapsedState((bool)button.IsChecked, p);
}
private static void SetCollapsedState(bool isCollapsed, Paragraph p)
{
InlineUIContainer buttonContainer = _collapseButtonDictionary[p];
List<Inline> disabledInlines;
if (_paragraphInlineStorage.ContainsKey(p))
{
disabledInlines = _paragraphInlineStorage[p];
}
else
{
disabledInlines = new List<Inline>();
_paragraphInlineStorage.Add(p, disabledInlines);
}
if (isCollapsed)
{
foreach (var item in p.Inlines)
{
disabledInlines.Add(item);
}
p.Inlines.Clear();
p.Inlines.Add(buttonContainer);
}
else
{
p.Inlines.Clear();
foreach (var item in disabledInlines)
{
p.Inlines.Add(item);
}
disabledInlines.Clear();
}
}
}
<Paragraph local:ParagraphExtensions.IsCollapsible="True">Lorem Ipsum</Paragraph>
Litterally rendant le paragraphe pliable est probablement pas la meilleure approche, je pense que ce genre de fonctionnalité est plutôt quelque chose du panneau/document enveloppants devrait prendre en charge.
Questions connexes
- 1. Comment faire pour réduire un expander
- 2. comment faire pour réduire l'image pour l'iphone
- 3. Comment faire pour réduire une TextArea
- 4. Comment faire pour réduire les notifications Android?
- 5. Comment faire pour réduire la sortie dans un script Bash?
- 6. Comment faire pour réduire les erreurs à l'intérieur d'un UDF?
- 7. Comment faire pour réduire toutes les méthodes dans XCode?
- 8. Comment faire pour réduire l'intégrité du tuyau nommé WCF
- 9. Comment cacher un paragraphe dans un FlowDocument?
- 10. Comment faire pour réduire le fichier Eclipse PDOM?
- 11. Comment faire pour réduire cinq textures OpenGL en une?
- 12. faire une image et un paragraphe assis côte à côte
- 13. Comment ajouter un paragraphe, puis une ligne?
- 14. Comment faire pour réduire la durée d'une animation implicite à 0 pour un CAReplicatorLayer
- 15. comment maintenir le paragraphe?
- 16. Comment rechercher une ligne SQl Server basée sur un paragraphe - spécifiquement, les mots dans le paragraphe, pas le paragraphe exact
- 17. Avec WPF, comment faire pour réduire un TextBlock en fonction du contenu de son TextBlock enfant?
- 18. comment générer un programme Java pour réduire le temps d'exécution
- 19. Comment utiliser BeautifulSoup pour extraire d'un paragraphe HTML?
- 20. Expression régulière pour réduire un cas
- 21. winforms tooltip grand paragraphe
- 22. RavenDB: Comment faire une carte simple/réduire l'agrégation
- 23. Annuler Un WinForm Réduire?
- 24. Comment résoudre un changement/réduire les conflits?
- 25. Ecrire à un paragraphe en utilisant jQuery
- 26. Comment réduire un tableau en Perl?
- 27. lignes ne cassant pas dans un paragraphe
- 28. Donner un effet de paragraphe par Css
- 29. Comment Awk Paragraphe dans un fichier texte complexe?
- 30. Comment contrôler de quel côté un paragraphe de marge apparaît?
Je me demande si cela vous concerne toujours, mais pour répondre à cette question, je dois demander: comment voulez-vous sélectionner le texte dans un paragraphe que vous voulez réduire? (pour reformuler ceci: paragraphe effondré => pas de texte => quoi sélectionner?) –