2016-08-26 22 views
10

Bir süredir WPF ile oynuyordum ve ilginç bir şeye rastladım. DateTime nesnesini Label içeriğine bağladığımda, tarihin yerel olarak biçimlendirilmiş temsilini görüyorum. Ancak, TextBlock'un Text özelliğine bağlandığımda, aslında İngilizce olanı görüyorum.Label ile TextBlock arasındaki kültür farkı

TextBlock, Label yalnızca ToString yöntemini çağıran bir tür dönüştürücü kullanıyor gibi görünüyor, ancak emin değilim.

Eğer öyleyse, neden Label dönüştürücüyü kullanmıyor?

Birisi bana neden böyle çalıştığını açıklayabilir mi? Size neler olduğunu incelemek için kısa bir örnek vereyim:

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

cevap

2

değildir.

Content mülkiyet dokümanlarında deniyor bir ContentPresenter tarafından görüntülenir: Bir UIElement için İçeriğin türünü çeviren TypeConverter varsa

, ContentPresenter kullandığı TypeConverter ve elde UIElement görüntülenir.

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

Referanslar:

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

Şimdi, şu pasajı aynen bir Label yaptığından daha dize üreten TypeConverter devralmasını bir DateTimeConverter var

+1

... ve String'in bir özelliğine herhangi bir şey bağlamanız yeterlidir. Sadece ToString() –

+0

ve TextBox ContentPresenter'dan türetilmez, dolayısıyla bir dönüştürücü kullanmaz. Bu şimdi bana mantıklı geliyor. Teşekkür ederim. – greenshade

+0

Rica ederim !!! – Aybe

1

Bunlar aslında oldukça farklı hayvanlardır. Daha fazla ayrıntı için

Kontrol şuna: Eğer o ContentControl kaynaklanmaktadır göreceksiniz Label için yakından bakmak durumunda https://joshsmithonwpf.wordpress.com/2007/07/04/differences-between-label-and-textblock/

Etiket aslında hatta bir kontrol

+1

Evet, bunların çok farklı olduklarını biliyorum ve bu, neden olduğu gibi olmasının nedeni olabilir. Ve yanılıyorsun, TextBlock bir kontrol değil. Ancak, TextBox bir denetim olduğunu ve verilen senaryoda TextBlock olarak davranır. – greenshade

İlgili konular