Label和TextBlock的文化差异

本文关键字:文化差异 TextBlock Label | 更新日期: 2023-09-27 18:04:17

我一直在玩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;
        }
    }
}

Label和TextBlock的文化差异

如果您仔细查看Label,您会发现它派生自ContentControl

Content属性由ContentPresenter显示,在文档中是这样说的:

如果有一个TypeConverter可以将Content的类型转换为一个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

它们实际上是完全不同的动物。

查看更多细节:https://joshsmithonwpf.wordpress.com/2007/07/04/differences-between-label-and-textblock/

标签实际上并不是一个控件