83

次の XAML があります。

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

そして、私はこのように表示されます:12 + 11 どういうわけか、それぞれの間に余分なスペースが挿入されますRun どうすれば表示できます12+11か?

4

6 に答える 6

160

実行タグ間のスペースが原因でスペースが発生します。これが最も簡単な修正方法です。

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

<TextBlock>との間のすべてが</TextBlock>TextBlock の text プロパティをターゲットにしているため、実行間の区切りからの空白が表示される効果を引き起こします。これに短縮することもできます。

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

この MSDN の記事には、xaml が空白を処理する方法に関するすべての詳細が記載されています。

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

改行と大量のタブが単一のスペースに変換される理由に興味がある場合

すべての空白文字 (スペース、改行、タブ) はスペースに変換されます。

連続するすべてのスペースが削除され、1 つのスペースに置き換えられます

于 2012-06-18T20:01:38.877 に答える
44

もう 1 つのオプションは、Run タグ間のスペースにコメントを付けて、コードを読みやすくし、余分なスペースを削除することです。

<TextBlock HorizontalAlignment="Center"
           VerticalAlignment="Center"
           FontSize="10" FontFamily="Arial" Foreground="#414141">        
    <Run Text="{Binding LoadsCount}" /><!--
 --><Run Text="+" /><!--
 --><Run Text="{Binding BrokerLoadsCount}" />
</TextBlock>
于 2018-02-19T19:31:20.183 に答える
21

Kevin の優れたソリューションの問題の 1 つはXAML、"ctrl-K + ctrl-D" などの XAML/XML 自動再フォーマット機能を適用すると、タグの単一行フォーマットが取り消されることです。Run私が見つけた 1 つの回避策は、次のようにタグをフォーマットすることです。

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

このようにタグを複数の行に分割するのはやや厄介ですがVisual Studio、XAML テキスト エディターで [属性間の新しい行とスペースを保持する] オプションを選択すると、この形式は自動再フォーマットによって変更されません。

XAML の連続する Run 要素間の余分なスペースを削除

于 2014-12-07T00:42:10.827 に答える
1

この動作を「バイパス」するために、添付プロパティを作成しました。

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));
    }
}

ソースコード全体とその説明は、ここにあります。この添付プロパティを使用することで、XAML の書式設定を希望どおりに維持できますが、レンダリングされた XAML でこれらの空白を取得することはできません。

于 2016-11-20T07:40:28.397 に答える