2010-05-04 34 views
39

Tại sao dòng mã nàyWPF StringFormat = {0: C} hiển thị như USD

<TextBlock Text="{Binding Net, StringFormat=c}"/> 

Output kết quả như $ xx.xx khi tất cả các thiết lập khu vực của tôi được thiết lập để Vương quốc Anh. Tôi mong đợi nó để sản xuất nó như £ xx.xx. Ý tưởng nào? Tôi đã thử các biến thể khác nhau của stringformat bao gồm StringFormat = {} {0: C} nhưng vẫn nhận được kết quả tương tự.

Cảm ơn bạn đã tìm kiếm.

Trả lời

62

Tôi không chắc chắn nếu điều này đã được sửa trong .NET 4, nhưng WPF chưa bao giờ chọn văn hóa hiện tại khi hiển thị những thứ như tiền tệ hoặc ngày tháng. Đó là một cái gì đó tôi xem xét một sự giám sát lớn, nhưng may mắn là dễ dàng sửa chữa.

Trong lớp App của bạn:

protected override void OnStartup(StartupEventArgs e) 
{ 
    FrameworkElement.LanguageProperty.OverrideMetadata(
     typeof(FrameworkElement), 
     new FrameworkPropertyMetadata(
      XmlLanguage.GetLanguage(
      CultureInfo.CurrentCulture.IetfLanguageTag))); 
    base.OnStartup(e); 
} 

Xem this excellent post để biết thêm thông tin.

+0

Tuyệt vời, tôi dành một giờ để tìm giải pháp và bạn đã giải quyết trong 5 phút, cảm ơn bạn. – Coesy

+1

Trên thực tế, theo [báo cáo lỗi này tại MS Connect] (https://connect.microsoft.com/VisualStudio/feedback/details/442569/wpf-binding-uses-the-wrong-currentculture-by-default), nó không phải là một lỗi, nhưng một tính năng * * như các trạng thái MS ... Khá lạ * tính năng *, tôi sẽ nói, nhưng nó có thể là tốt để biết rằng điều này có thể không được "cố định" trong một phiên bản trong tương lai. – gehho

+4

Tùy chọn này sẽ không nhận các thay đổi tùy chỉnh đối với cài đặt khu vực (nghĩa là tôi đang sử dụng tiếng Đức, nhưng với định dạng ngày sane [ISO 8601]). Có cách giải quyết nào cho điều đó không? – Joey

13

gì làm việc cho tôi:
1) Trong App.xaml override OnStartup() và thêm - System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("et-EE");

2) Xác định trong XAML @ Window cấp - xmlns:sysglb="clr-namespace:System.Globalization;assembly=mscorlib"

3) Trong XAML - <TextBox Text="{Binding Path=Price, StringFormat='{}{0:C}', ConverterCulture={x:Static sysglb:CultureInfo.CurrentUICulture}}" />

Điều này chính xác chọn bất kỳ tùy chỉnh cài đặt khu vực. Mặc dù tôi đang sử dụng CultureInfo được tạo thủ công trong bước đầu tiên, tôi chắc chắn rằng nó có thể chuyển vào một trong các loại tĩnh - ví dụ: System.Globalization.CultureInfo.CurrentCulture (Tôi chưa thử nghiệm nó ...)

+0

Đây là giải pháp tốt nhất mà tôi tìm thấy, cảm ơn rất nhiều! –

+1

Điều này đã giải quyết được sự cố cài đặt tùy chỉnh. Đối với bước 1 tôi đã sử dụng "= CultureInfo mới (CultureInfo.CurrentCulture.IetfLanguageTag)" thay vì mã hóa cứng nó. – avenmore

+0

Tuyệt vời, cảm ơn bạn. Microsoft thực sự nên sửa lỗi này. – Peter

18

Tôi làm ngôn ngữ = "en-GB" trong cửa sổ chính, ví dụ:

<Window x:Class="AllocateWPF.Vouchers" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Test" Height="692" Width="1000" Language="en-GB"> 
+0

Chắc chắn là cách nhanh nhất khi bạn tạo ra một cửa sổ! – Grim

+0

Trình tiết kiệm cuộc sống, tôi yêu bạn. Để hiển thị dấu và dấu chấm ở dấu phẩy của Euro (văn hóa Ý): Ngôn ngữ = "it-IT" trong XAML, sau đó định dạng chuỗi bằng "€ #, ## 0,00" –

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