Разница в культуре между 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;
}
}
}
Ответы
Ответ 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
Ответ 2
Они на самом деле совсем разные звери.
Проверьте это для получения дополнительной информации:
https://joshsmithonwpf.wordpress.com/2007/07/04/differences-between-label-and-textblock/
Ярлык на самом деле даже не является элементом управления