2016-08-26 48 views
10

Tôi đã chơi với WPF một lúc và tôi bắt gặp một điều thú vị. Khi tôi liên kết đối tượng DateTime với nội dung của Label thì tôi sẽ thấy biểu diễn được định dạng cục bộ của ngày đó. Tuy nhiên, khi tôi liên kết với thuộc tính Văn bản của TextBlock thì tôi thực sự thấy tiếng Anh.Sự khác biệt về văn hóa giữa Nhãn và TextBlock

Có vẻ như TextBlock đang sử dụng một số loại công cụ chuyển đổi trong khi Label chỉ gọi phương thức ToString nhưng tôi không chắc chắn về điều đó.

Nếu có, tại sao không sử dụng bộ chuyển đổi Label?

Ai đó có thể giải thích cho tôi tại sao nó hoạt động theo cách đó? Tôi cung cấp một mẫu ngắn để cho phép các bạn kiểm tra những gì đang xảy ra:

// 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; 
     } 
    } 
} 

Trả lời

2

Nếu bạn có một cái nhìn gần gũi hơn với Label bạn sẽ thấy rằng nó có nguồn gốc từ ContentControl.

Content bất động sản sẽ được hiển thị bằng một ContentPresenter nơi trong các tài liệu người ta nói như sau:

Nếu có một TypeConverter có thể chuyển đổi các loại nội dung cho một UIElement, các ContentPresenter sử dụng mà TypeConverter và UIElement kết quả được hiển thị.

Bây giờ có một DateTimeConverter kế thừa từ TypeConverter, đoạn sau sản xuất chính xác cùng một chuỗi hơn một Label làm:

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

Tài liệu tham khảo:

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

... và liên kết bất kỳ thứ gì với thuộc tính kiểu String chỉ cần gọi 'ToString()' –

+0

Phải và TextBox không xuất phát từ ContentPresenter, do đó không sử dụng trình chuyển đổi. Điều đó có ý nghĩa với tôi bây giờ. Cảm ơn bạn. – greenshade

+0

Bạn hoan nghênh !!! – Aybe

1

Chúng thực sự là những con thú khác nhau.

Kiểm tra này ra để biết thêm chi tiết: https://joshsmithonwpf.wordpress.com/2007/07/04/differences-between-label-and-textblock/

Label thực sự không phải là thậm chí một điều khiển

+1

Vâng, tôi biết rằng chúng khác biệt đáng kể và chắc chắn đó có thể là lý do tại sao nó như vậy. Và bạn sai, TextBlock không phải là một điều khiển. Nhưng lưu ý rằng TextBox là một điều khiển và nó hoạt động như TextBlock trong kịch bản nhất định. – greenshade

Các vấn đề liên quan