2

アンパサンドを含むリテラル文字列を持つ文字列形式を作成しようとしています。& と & を試しました。(スペースなし) ですが、両方とも VS2010 デザイナーで例外が発生します。これが私が取り組んでいるものです:

Text="{Binding Path=LearningOpportunities, StringFormat='Sharing & Learning Opportunitites:\{0\}'}"

「&」を使用すると、「アンパサンド「&」で始まるエンティティ参照またはシーケンスは、セミコロン「;」で終了する必要があります」と表示されます。& amp; を使用すると、「インデックス (ゼロ ベース) はゼロ以上で、引数リストのサイズ未満でなければなりません」という FormatException が発生します。私はしばらく WPF から離れて Web 開発を行っていたので、少し錆びているように感じています。どうすればこれを機能させることができますか?

編集:逃走が犯人であるという憶測がたくさんありますが、私が知る限り、それはすべて間違っています. 邪魔にならないように、式からアンパサンドを外して、機能するものと機能しないものを次に示します。

機能する形式:

StringFormat=Sharing and learning opportunitites:\{0\}
StringFormat='Sharing and learning opportunitites:\{0\}'
StringFormat={}Sharing and learning opportunitites:{0}
StringFormat='{}Sharing and learning opportunitites:{0}'
StringFormat=Sharing and learning opportunitites:{0}
StringFormat='Sharing and learning opportunitites:{0}'

動作しない形式:

StringFormat=Sharing and learning opportunitites:{}{0}
StringFormat=Sharing and learning opportunitites:{{0}}  (Outputs literal "{0}")

要約すると、文字列の先頭に開き中かっこ {} と閉じ中かっこ {} を配置することで、文字列内のすべての中かっこをエスケープするか、バックスラッシュを使用して個々の中かっこをエスケープできます。驚いたことに、中かっこをエスケープしなくても機能しましたが、Visual Studio での構文の色付けはかなり見苦しかったです。見苦しい構文の色分けを避けるために、フォーマット文字列を一重引用符で囲むことができます。

したがって、エスケープを停止すると、アンパサンドをフォーマット文字列に追加すると、エスケープされているかどうかに関係なく、例外が発生するという問題があります。エスケープされている場合とエスケープされていない場合の唯一の違いは、異なる例外が発生することです。

4

3 に答える 3

2

編集編集編集:

あはは!Cider のデザイン サーフェイスの血まみれのバグであることが判明しました。

証拠:

次の一連の XAML 行を試してください。

<StackPanel>
    <!-- should show '$YoMamma' -->
    <TextBlock Text="{Binding Path=Value, StringFormat=&#x24;{0}}"/>
    <!-- should show '%YoMamma' -->
    <TextBlock Text="{Binding Path=Value, StringFormat=&#x25;{0}}"/>
    <!-- should show '&YoMamma', but crashes the designer -->
    <!--<TextBlock Text="{Binding Path=Value, StringFormat=&#x26;{0}}"/>-->
    <!-- should show '"YoMamma', but crashes the designer -->
    <!--<TextBlock Text="{Binding Path=Value, StringFormat=&#x27;{0}}"/>-->
    <!-- should show '(YoMamma' -->
    <TextBlock Text="{Binding Path=Value, StringFormat=&#x28;{0}}"/>
    <!-- should show ')YoMamma' -->
    <TextBlock Text="{Binding Path=Value, StringFormat=&#x29;{0}}"/>

</StackPanel>

接続するためにバグ レポートを送信しました。誰かが応答するかどうかを確認します 。文字列形式のエンティティ

「バグ」は設計者にあるため、この回答の残りの部分は、潜在的に有用ではありますが、半問題です。

ここで覚えておくべきことは、XAMLXML であるため、それに応じてアンパサンドをエンコードする必要があるということです。

&amp;

次のように動作する必要があります。

&#38;

編集:

ああ、そうです-コメントの前後で説明されているように、問題はアンパサンド自体にあるのではなく、 a の周囲の中括弧内の置換マーカーの「エスケープ」にありますBinding-これを修正するには、あなた'実際には 3 つのオプションがあります。

編集 2: ああ、マークダウンは私の投稿を気に入らないかもしれないと思います (そして、とにかく 1 つの点で間違っていました) - 完全な例を一緒にまとめることができるかどうか見てみましょう:

念のため、ここにもペーストビンのリンクがあります: http://pastebin.com/yfrpvxs1

たとえば、次のようなコンテキスト オブジェクトがあるとします。

public class Foo : INotifyPropertyChanged
{
    private string _value;
    public string Value
    {
        get { return _value; }
        set { _value = value; FireNpc("Value"); }
    }
    private decimal _numberValue;
    public decimal NumberValue
    {
        get { return _numberValue; }
        set { _numberValue = value; FireNpc("NumberValue"); }
    }
    private DateTime _dateValue;
    public DateTime DateValue
    {
        get { return _dateValue; }
        set { _dateValue = value; FireNpc("DateValue"); }
    }
    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    private void FireNpc(string name)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

そしてウィンドウコードビハインド:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new Foo()
            {
                Value = "YoMamma", 
                DateValue = DateTime.Now, 
                NumberValue = 3.14m
            };
    }
}

レッツXAML!

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <!-- should show '#1:Foo & Bar:YoMamma' -->
        <TextBlock Text="{Binding Path=Value, StringFormat=#1:Foo &amp; Bar:{0}}"/>

        <!-- should show '#2:Foo & Bar:YoMamma' -->
        <TextBlock>
            <TextBlock.Text>
                <Binding Path="Value" StringFormat="#2:Foo &amp; Bar:{0}"/>
            </TextBlock.Text>
        </TextBlock>

        <!-- will actually show the '{' and '}', so 'Foo & Bar:{0}' -->
        <TextBlock Text="{Binding Path=Value, StringFormat=Foo &amp; Bar:{{0}}}"/>

        <!-- default 'custom' (there's a fun oxymoron) format - should be '$3.14' -->
        <TextBlock Text="{Binding Path=NumberValue, StringFormat=c}"/>

        <!-- custom 'custom' (bear with me) format -->
        <TextBlock Text="{Binding Path=DateValue, StringFormat=MM/dd/yyyy}"/>

        <!-- multi parameter formatting-->
        <TextBlock>
            <TextBlock.Text>
                <MultiBinding StringFormat="As of {2:MM/dd/yyyy}, {0} cost {1:c}">
                    <Binding Path="Value"/>
                    <Binding Path="NumberValue"/>
                    <Binding Path="DateValue"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </StackPanel>
</Window>

さて、それに便乗してMultiBinding、ばかげたことをすることができます - これをコンテキストに追加しましょう:

    // Heh...don't actually do this, naturally...
    private string _ampersandValue;
    public string AmpersandValue
    {
        get { return _ampersandValue; }
        set { _ampersandValue = value; FireNpc("AmpersandValue"); }
    }


    this.DataContext = new Foo()
        {
            Value = "YoMamma", 
            DateValue = DateTime.Now, 
            NumberValue = 3.14m,
            AmpersandValue = "&"
        };

そして、この XAML を追加します。

    <!-- And a crazy-person's method, using multi parameter formatting-->
    <TextBlock>
        <TextBlock.Text>
            <MultiBinding StringFormat="{}{0} {1} {0} = {0}">
                <Binding Path="Value"/>
                <Binding Path="AmpersandValue"/>
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>
于 2013-03-22T18:15:33.940 に答える
0

バインディングで使用したいときはいつでもStringFormat、フォーマットに追加のテキストまたはスペースが含まれている場合は、次のように追加の中括弧のセットを前に置きます。

StringFormat={}Sharing and learning opportunitites:{0}

他の方法を使用してオンラインで参考文献を見たことは知っていますが、それらはすべて一度や二度は失敗しました。異なるバージョンの WPF は異なるStringFormat構文をサポートしていると思います。そのため、使用しているバージョンによっては、他の構文も機能する可能性がありますが、かなり普遍的であることがわかったのは上記だけです。

また、文字&amp;をエスケープするために使用する必要があります&

StringFormat={}Sharing &amp; learning opportunitites:{0}
于 2013-03-25T15:26:31.597 に答える
0

&amp;アンパサンドに使用し、\エスケープ文字として機能している を削除する必要があります。必要のない余分な'文字もあります。次のことを試してください。

Text="{Binding Path=LearningOpportunities, StringFormat=Sharing &amp; Learning Opportunitites:{0}}"
于 2013-03-22T18:14:15.597 に答える