2009-11-02 16 views
10

chuyển đổi Khi tuyên bố trong một ứng dụng WPF, nên I:Tôi có nên khai báo trình chuyển đổi trong App.xaml hoặc dưới dạng tài nguyên cho mỗi tệp không?

  1. Khai tất cả chuyển đổi của tôi trong App.xaml (tức là trong <Application.Resources/>) do đó, nó cung cấp cho toàn bộ ứng dụng
  2. Khai báo bộ chuyển đổi chỉ cần thiết cho mỗi Page/Window/ResourceDictionary/UserControl vv trong phần Resources họ
  3. Cái gì khác hoàn toàn

Về khả năng đọc, phương pháp 1 có vẻ tốt nhất với tôi, nhưng câu hỏi của tôi là về hiệu suất. Phương pháp nào là tài nguyên hiệu quả nhất về hiệu suất, bộ nhớ, v.v.?

Trả lời

37

Vâng, tôi chỉ không khai báo chúng trong xaml. Thay vào đó, tôi bổ sung thêm một công cụ chuyển đổi của tôi từ MarkupExtension. Như thế này:

public class MyValueConverter : MarkupExtension, IValueConverter 
{ 
    private static MyValueConverter _converter = null; 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (_converter == null) _converter = new MyValueConverter();  
     return _converter; 
    } 

    public object Convert 
    (object value, Type targetType, object parameter, CultureInfo culture) { } 
    public object ConvertBack 
    (object value, Type targetType, object parameter, CultureInfo culture) { } 
} 

này cho phép tôi sử dụng chuyển đổi của tôi ở bất cứ đâu, như thế này:

Source="{Binding myValue, Converter={converters:MyValueConverter}}" 

nơi chuyển đổi là không gian tên trong đó tôi đã tuyên bố chuyển đổi của tôi.

Đã học được mẹo này chỉ từ luồng luồng ngăn xếp cũ.

+2

Tôi vừa học được điều gì đó, chắc chắn sẽ hữu ích! – Shimmy

+2

Và có, điều này là tốt hơn về hiệu suất vì nó không khởi tạo một đối tượng mới mỗi khi bộ chuyển đổi được sử dụng. Nó chỉ tạo ra một cá thể trước khi trả về cuộc gọi đầu tiên tới MarkupExtension và trả về cùng một cá thể mỗi lần. – Yogesh

+0

Cảm ơn! Điều này làm cho cuộc sống dễ dàng hơn. – si618

0

Nếu bạn chỉ cần một công cụ chuyển đổi cho một cửa sổ, tôi sẽ đặt nó cho một cửa sổ (hoặc thậm chí chỉ kiểm soát vùng chứa giữ điều khiển sử dụng nó).

Tôi cho rằng điều này dễ bảo trì hơn - bạn có thể xem tờ khai chuyển đổi và có thể cho biết điều gì sử dụng nó. Bạn biết rằng nếu bạn thay đổi các điều khiển trên trang cụ thể đó để không còn sử dụng trình chuyển đổi, bạn có thể lấy nó ra khỏi tài nguyên của trang mà không ảnh hưởng đến bất kỳ thứ gì khác. Ngược lại, nếu một trình biến đổi là một tài nguyên ứng dụng, nó không đơn giản như vậy để xác định những gì đang sử dụng nó, nếu có.

Nếu cùng một công cụ chuyển đổi đang được sử dụng bởi nhiều trang, tôi sẽ vẫn đặt đặt dưới mỗi tài nguyên trang. Thực sự, nó chỉ là một dòng phụ trong XAML.

Dù sao, đó là ý kiến ​​của tôi, tính đến hôm nay. Tôi đang chờ một bài khác tranh cãi chính xác điều ngược lại. :-)

+0

Không may mắn như vậy. Câu trả lời của tôi là một nửa đối diện, một nửa giống nhau :-P – devuxer

2

Tôi có ResourceDictionary khai báo một số trình chuyển đổi thường cần thiết, chẳng hạn như trình chuyển đổi bool-to-visibility. Tôi tham khảo từ điển này trực tiếp trong App.xaml.

Tôi tuyên bố các trình chuyển đổi khác cụ thể hơn cho một tình huống cụ thể ở cấp Trang/Cửa sổ (hoặc trong một ResourceDictionary được tham chiếu bởi Trang/Cửa sổ).

Tôi không thể trả lời câu hỏi hiệu suất một cách dứt khoát, nhưng tôi sẽ rất ngạc nhiên nếu nó tạo sự khác biệt thực tế về thời gian tải hoặc sử dụng bộ nhớ. Tuyên bố một trình biến đổi về cơ bản là một sự khởi tạo đối tượng, vì vậy nó phải rất hiệu quả và sử dụng rất ít bộ nhớ, nhưng tôi chưa thực hiện bất kỳ lược tả nào để so sánh hiệu suất cấp ứng dụng so với mức cửa sổ.

+0

Đó là câu hỏi của tôi ... Nếu bạn sẽ biết câu trả lời về hiệu suất, xin đừng quên quay lại. – Shimmy

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