Отображение статического числа в TextBlock с использованием текущего десятичного разделителя ОС

Я думаю, что это очень простой вопрос, но я не могу его запустить. Я хочу показать фиксированное число внутри моего представления WPF без привязки. Это число равно 0,001 или по-немецки 0,001. Смотрите разделитель. Теперь, если я переключаю язык пользовательского интерфейса, разделитель чисел должен быть обновлен до правильного языка.

<TextBlock>
    <Run Text="0.001" />
    <Run Text=" " />
    ...
</TextBlock>

Это должно быть чрезвычайно тривиально, и я думаю, что StringFormat должен соответствовать потребностям, но, как я уже сказал, я не могу заставить его работать. Спасибо за вашу помощь

Решение: спасибо, что @Corentin Pane указал мне на решение. Как он сказал, мне нужно объявить значение

<TextBlock>
    <TextBlock.Resources>
        <system:Double x:Key="MinValue">0.001</system:Double>
    </TextBlock.Resources>

    <Run Text="{Binding Source={StaticResource MinValue}, Mode=OneTime, StringFormat='N3', ConverterCulture={x:Static gl:CultureInfo.CurrentCulture}}" />
    <Run Text=" " />
    ...
</TextBlock>

person Daniel DirtyNative Martin    schedule 05.02.2020    source источник
comment
Во-первых, "0.001" — это строка, а не число; По умолчанию WPF не знает, что вы пытаетесь отобразить здесь число. Возможные решения см. в этой теме.   -  person Kilazur    schedule 05.02.2020
comment
Это верно. Но это не обязательно должно быть число, я также могу сделать несколько ‹Runs /› и один, содержащий только . или ,. Но тогда мне нужно получить правильный разделитель чисел   -  person Daniel DirtyNative Martin    schedule 05.02.2020


Ответы (1)


Если вы хотите, чтобы WPF правильно отформатировал ваше число, оно должно быть числом с самого начала (например, double), а не жестко заданной строкой, например "0.001". Вы можете использовать привязку к статическому ресурсу:

<TextBlock>
    <TextBlock.Resources>
        <system:Double x:Key="myFixedValue">0.001</system:Double>
    </TextBlock.Resources>
    <TextBlock.Text>
        <Binding Source="{StaticResource myFixedValue}"/>
    </TextBlock.Text>
</TextBlock>

со следующим пространством имен:

xmlns:system="clr-namespace:System;assembly=mscorlib"

Теперь вы можете беспокоиться о форматировании, и, как указано в комментарии, эта ветка содержит некоторые подсказки. Например, вы можете изменить свой Binding на:

<Binding Source="{StaticResource myFixedValue}"
         StringFormat="f"
         ConverterCulture="{x:Static gl:CultureInfo.CurrentCulture}"/>

и добавить

xmlns:gl="clr-namespace:System.Globalization;assembly=mscorlib"

декларация.

person Corentin Pane    schedule 05.02.2020