2009-11-02 15 views
10

在WPF應用程序聲明當轉換器,我應該:我應該在App.xaml中聲明轉換器還是作爲每個文件資源?

  1. 聲明所有我的轉換器中的App.xaml(即<Application.Resources/>),所以它可用於整個應用程序
  2. 聲明只需要轉換器每個Page/Window/ResourceDictionary/UserControl等在他們的Resources部分
  3. 別的東西完全

關於可讀性,方法1似乎對我最好,但我的問題是關於性能。哪種方法在性能,內存等方面資源效率最高?

回答

37

嗯,我只是不會在xaml中聲明它們。相反,我另外從MarkupExtension得到了我的一個轉換器。就像這樣:

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) { } 
} 

這讓我在任何地方使用我的轉換器,像這樣:

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

,其中轉換器是在我宣佈我的轉換器的命名空間。

只從舊的stackoverflow線程學習這個技巧。

+2

我剛學到東西,肯定會有用的! – Shimmy 2009-11-03 02:44:56

+2

是的,這在性能方面更好,因爲每次使用轉換器時都不會實例化新對象。它只在第一次調用MarkupExtension返回之前創建一個實例,並且每次都返回相同的實例。 – Yogesh 2009-11-03 03:32:07

+0

謝謝!這使生活更輕鬆。 – si618 2010-09-25 03:50:20

0

如果你只需要一個窗口的轉換器,我會把它放在一個窗口中(或者甚至只是容納使用它的控件的容器控件)。

我會爭辯說,這是更可維護的 - 你可以看看轉換器的聲明,並能夠告訴什麼使用它。您知道,如果您更改特定頁面上的控件以不再使用轉換器,則可以將其從頁面資源中取出,而不會影響其他任何內容。相反,如果轉換器是應用程序資源,那麼確定使用它的內容並不那麼簡單,如果有的話。

如果同一個轉換器被多個頁面使用,我會把仍然是放在每個頁面資源下。真的,這只是XAML中的一個額外的行。

無論如何,這是我的觀點,截至今日。我期待另一篇文章辯論完全相反。 :-)

+0

沒有這樣的運氣。我的回答是一半相反,一半相同:-P – devuxer 2009-11-02 06:13:56

2

我有一個ResourceDictionary聲明瞭幾個常用轉換器,比如一個bool-to-visibility轉換器。我直接在App.xaml中引用此字典。

我聲明瞭其他轉換器,這些轉換器對頁/窗口級別(或由頁面/窗口引用的ResourceDictionary)中的特定情況更加具體。

我無法明確地回答性能問題,但是如果它在加載時間或內存使用方面產生實際差異,我會非常驚訝。聲明一個轉換器基本上是一個對象實例化,所以它應該非常高效並且使用很少的內存,但是我沒有做任何分析來比較應用程序級別和窗口級別的性能。

+0

那麼這是我的問題... 如果你會知道性能答案,請不要忘記回來。 – Shimmy 2009-11-02 12:11:16

相關問題