【问题标题】:Culture difference between Label and TextBlockLabel 和 TextBlock 之间的文化差异
【发布时间】:2016-08-26 18:39:34
【问题描述】:

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

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

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

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

    如果存在将 Content 类型转换为 UIElement 的 TypeConverter,则 ContentPresenter 使用该 TypeConverter 并显示生成的 UIElement。

    现在有一个DateTimeConverter 继承自TypeConverter,下面的sn-p 产生的字符串与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

    【讨论】:

    • ...并将任何内容绑定到 String 类型的属性只需调用 ToString()
    • 对,TextBox 不是从 ContentPresenter 派生的,因此不使用转换器。这对我来说很有意义。谢谢。
    【解决方案2】:

    它们实际上是完全不同的野兽。

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

    标签实际上甚至不是控件

    【讨论】:

    • 是的,我知道它们有很大的不同,这肯定是它保持现状的原因。你错了,TextBlock 不是一个控件。但请注意,TextBox 是一个控件,它在给定场景中的行为类似于 TextBlock。
    • 你的意思是 TextBlock 不是控件,不是标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多