Подтвердить что ты не робот

Разница в культуре между Label и TextBlock

Я играл с WPF некоторое время, и я наткнулся на интересную вещь. Когда я привязываю объект DateTime к содержимому Label, тогда я вижу локально отформатированное представление даты. Однако, когда я привязываюсь к свойству TextBlock Text, я на самом деле вижу английский.

Кажется, что TextBlock использует какой-то конвертер, тогда как Label просто вызывает метод ToString, но я не уверен в этом.

Если да, то почему не используется Label конвертер?

Может ли кто-нибудь объяснить мне, почему он работает так, как есть? Я даю короткую выборку, чтобы вы, ребята, проверяли, что происходит:

// MainWindow.xaml
<Window x:Class="BindConversion.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
    <StackPanel HorizontalAlignment="Center" Margin="3">
        <StackPanel>
            <Label Content="{Binding Dt}"/>
            <TextBlock Text="{Binding Dt}"/>
        </StackPanel>
    </StackPanel>
</Window>

// MainWindow.xaml.cs
using System;
using System.Windows;

namespace BindConversion
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public DateTime Dt { get; set; }
        public MainWindow()
        {
            InitializeComponent();

            DataContext = this;
            Dt = DateTime.Now;
        }
    }
}
4b9b3361

Ответ 1

Если вы посмотрите ближе к Label, вы увидите, что оно происходит от ContentControl.

Content свойство отображается ContentPresenter, где в документах сказано следующее:

Если есть TypeConverter, который преобразует тип содержимого в UIElement, ContentPresenter использует этот TypeConverter, и отображается отображаемое UIElement.

Теперь существует DateTimeConverter, наследующий от TypeConverter, следующий фрагмент воспроизводит точно такую ​​же строку, что и Label:

var dateTimeConverter = new DateTimeConverter();
var convertToString = dateTimeConverter.ConvertToString(DateTime.Now);

Литература:

https://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/system.componentmodel.datetimeconverter(v=vs.110).aspx