83 votes

Comment se débarrasser des espaces blancs entre les Runs dans un TextBlock ?

J'ai le XAML suivant :

<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"
                                               FontSize="10" FontFamily="Arial" Foreground="#414141">        
                                            <Run Text="{Binding LoadsCount}" />        
                                            <Run Text="+" />        
                                            <Run Text="{Binding BrokerLoadsCount}" />
                                        </TextBlock>

Et je reçois un affichage comme celui-ci : 12 + 11 D'une manière ou d'une autre, il insère un espace supplémentaire entre chaque Run Comment l'afficher ? 12+11 ?

160voto

Kevin DiTraglia Points 9303

Les espaces entre les balises d'exécution sont à l'origine des espaces, c'est la solution la plus simple.

<TextBlock 
   HorizontalAlignment="Center" 
   VerticalAlignment="Center"
   FontSize="10" 
   FontFamily="Arial" 
   Foreground="#414141">        
      <Run Text="{Binding LoadsCount}" /><Run Text="+" /><Run Text="{Binding BrokerLoadsCount}" />
</TextBlock>

Parce que tout ce qui se trouve entre le <TextBlock> y </TextBlock> cible la propriété textuelle du bloc de texte, l'espace blanc des coupures entre les passages provoque l'effet que vous voyez. Vous pouvez également le raccourcir comme suit.

<Run Text="{Binding LoadsCount}" />+<Run Text="{Binding BrokerLoadsCount}" />

Cet article de MSDN donne toutes les précisions sur la façon dont xaml gère les espaces blancs.

http://msdn.microsoft.com/en-us/library/ms788746.aspx

Si vous étiez curieux de savoir pourquoi une pause et une tonne de tabulations se traduisent par un espace unique

Tous les caractères d'espacement (espace, interligne, etc.) espaces.

Tous les espaces consécutifs sont supprimés et remplacés par un espace.

44voto

Une autre option consiste à commenter l'espace entre les balises Run, ce qui permet de conserver un code lisible tout en supprimant l'espace supplémentaire.

<TextBlock HorizontalAlignment="Center"
           VerticalAlignment="Center"
           FontSize="10" FontFamily="Arial" Foreground="#414141">        
    <Run Text="{Binding LoadsCount}" /><!--
 --><Run Text="+" /><!--
 --><Run Text="{Binding BrokerLoadsCount}" />
</TextBlock>

21voto

Glenn Slayden Points 1995

L'un des problèmes de la solution proposée par Kevin est que le formatage sur une seule ligne de XAML est annulée lorsque vous appliquez certaines des fonctions de reformatage automatique XAML/XML, par exemple "ctrl-K + ctrl-D". Une solution que j'ai trouvée consiste à formater la balise Run comme suit :

<TextBlock>
    <Run FontStyle="Italic"
    Text="aaa" /><Run 
    Text="bbb" />
</TextBlock>

Bien qu'il soit quelque peu gênant de diviser la balise en plusieurs lignes, ce format ne sera pas modifié par le reformatage automatique, à condition que vous sélectionniez l'option Visual Studio option "Préserver les nouvelles lignes et les espaces entre les attributs" pour l'éditeur de texte XAML :

extra space eliminated between consecutive Run elements in XAML

1voto

Nick Points 1

J'ai écrit une propriété attachée pour "contourner" ce comportement.

public class TextBlockExtension
{

    public static bool GetRemoveEmptyRuns(DependencyObject obj)
    {
        return (bool)obj.GetValue(RemoveEmptyRunsProperty);
    }

    public static void SetRemoveEmptyRuns(DependencyObject obj, bool value)
    {
        obj.SetValue(RemoveEmptyRunsProperty, value);

        if (value)
        {
            var tb = obj as TextBlock;
            if (tb != null)
            {
                tb.Loaded += Tb_Loaded;
            }
            else
            {
                throw new NotSupportedException();
            }
        }
    }

    public static readonly DependencyProperty RemoveEmptyRunsProperty =
        DependencyProperty.RegisterAttached("RemoveEmptyRuns", typeof(bool), 
            typeof(TextBlock), new PropertyMetadata(false));

    public static bool GetPreserveSpace(DependencyObject obj)
    {
        return (bool)obj.GetValue(PreserveSpaceProperty);
    }

    public static void SetPreserveSpace(DependencyObject obj, bool value)
    {
        obj.SetValue(PreserveSpaceProperty, value);
    }

    public static readonly DependencyProperty PreserveSpaceProperty =
        DependencyProperty.RegisterAttached("PreserveSpace", typeof(bool), 
            typeof(Run), new PropertyMetadata(false));

    private static void Tb_Loaded(object sender, RoutedEventArgs e)
    {
        var tb = sender as TextBlock;
        tb.Loaded -= Tb_Loaded;

       var spaces = tb.Inlines.Where(a => a is Run 
            && string.IsNullOrWhiteSpace(((Run)a).Text) 
            && !GetPreserveSpace(a)).ToList();
        spaces.ForEach(s => tb.Inlines.Remove(s));
    }
}

L'ensemble du code source et l'explication de tout cela peuvent être trouvés aquí . En utilisant cette propriété attachée, vous pouvez conserver le formatage de votre XAML comme vous le souhaitez, mais vous n'obtiendrez pas ces espaces blancs dans votre XAML rendu.

1voto

Viktor Jasper Points 53

Ma solution est de rendre la taille de la police par défaut presque invisible( FontSize="1" ) et régler ensuite la taille de la police à la taille souhaitée à chaque fois. <Run :

<TextBlock HorizontalAlignment="Center"
           VerticalAlignment="Center"
           FontSize="1"
           FontFamily="Arial"
           Foreground="#414141">        

    <Run FontSize="10" Text="{Binding LoadsCount}" />        
    <Run FontSize="10" Text="+" />        
    <Run FontSize="10" Text="{Binding BrokerLoadsCount}" />
</TextBlock>

Il est peut-être préférable de le faire dans Code Behind. J'ai essayé les solutions précédentes, mais dans certaines situations, VS a simplement formaté le code soigneusement indenté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X