标签(Label)和文本块(TextBlock)之间的文化差异

10

我已经使用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;
        }
    }
}
2个回答

2
如果您仔细查看标签,就会发现它是从ContentControl派生的。 Content属性由ContentPresenter显示,在文档中如下所述: 如果有一种TypeConverter将Content的类型转换为UIElement,则ContentPresenter使用该TypeConverter,并显示结果UIElement。 现在有一个从TypeConverter继承的DateTimeConverter,以下代码段生成与Label完全相同的字符串:
var dateTimeConverter = new DateTimeConverter();
var convertToString = dateTimeConverter.ConvertToString(DateTime.Now);

References:

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


1
...将任何东西绑定到 String 类型的属性只会调用 ToString() - 15ee8f99-57ff-4f92-890c-b56153
没错,TextBox并没有继承自ContentPresenter,因此也没有使用转换器。现在我明白了。谢谢。 - bottaio

1

1
是的,我知道它们有很大的不同,这可能就是为什么事情会变成这样的原因。而且你错了,TextBlock不是一个控件。但请注意,TextBox是一个控件,并且在给定的场景中表现得像TextBlock一样。 - bottaio
你的意思是 TextBlock 不是控件,而不是标签。 - StayOnTarget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接