2017-04-27 13 views
1

私はUWPプロジェクトとWPFプロジェクトを持っています。どちらのプロジェクトも同じコンバータが必要です。しかし、Interface IValueConverterはWPFのように別の名前空間のUWPにあります。さらに、最後のパラメータは同じではありません(WPFではUWPのCultureInfoです)。 両方のプロジェクトのコンバータを作成するベストプラクティスは何ですか?WPFおよびUWPプロジェクトでIValueConverterを使用する場合のベストプラクティス

私のソリューション私は、WPF IValueConverterとUalpからのIValueConverterの2つのメソッドをそれぞれ定義するValueConverterBaseクラスを持つnetstandardプロジェクトを持っています。今、私はロジックを行いnetstandardプロジェクトでコンバータを作成することができます

public abstract class ValueConverterBase 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     return this.OnConvert(value, targetType, parameter, language); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     return this.OnConvertBack(value, targetType, parameter, language); 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return this.OnConvert(value, targetType, parameter, culture.TwoLetterISOLanguageName); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return this.OnConvertBack(value, targetType, parameter, culture.TwoLetterISOLanguageName); 
    } 

    public abstract object OnConvert(object value, Type targetType, object parameter, string language); 
    public abstract object OnConvertBack(object value, Type targetType, object parameter, string language); 
} 

:それはまたsepcificコンバータを実装している2つの抽象メソッドを定義します。 UWPでこのコンバータを使用することが可能とWPFは、各プロジェクトには、コンバータと、特定のIValueConverterから派生クラスを作成する必要がありますするには、次の

public class WpfConverter : CommonConverter, IValueConverter 
{ 
} 

public class UwpConverter : CommonConverter, IValueConverter 
{ 
} 

私は各コンバータのための3つの新しいクラスを追加する必要があり、この解決策の問題。また、すべての開発者はこの回避策について知っておく必要があります。 別のポイントは、コンバータでWPFまたはUWP固有のロジックを使用できないことです。誰かに別の解決策がありますか?

新しいソリューションは、私が@Anton Tykhyyと@Heinziからの答えと私の最初のソリューションを組み合わせます。私はプリプロセッサと共有ソースではなく、アセンブリを使用したい

public abstract class ValueConverterBase 
#if UWP 
    : Windows.UI.Xaml.Data.IValueConverter 
#endif 
#if WPF 
    : System.Windows.Data.IValueConverter 
#endif 
{ ... 

答えて

4

: は、私は私のコンバータが含まれていると、私のValueConverterBaseが追加されます共有プロジェクトを作成しました。コンバーターを別のアセンブリに配置する場合は、WPFとUWPアセンブリを同じソースから異なるプロジェクト構成で構築できます。 #ifは、世界で最もエレガントなツールではありませんが、それは仕事を行い、あなたは1つのファイルと1つのクラスを持っています。サンプルコンバーターを作成し、すべての開発者にコピーさせるようにしてください。

#if UWP 
using Windows.UI.Xaml.Data ; 
#else 
using System.Windows.Data ; 
#endif 

public class SampleValueConverter : IValueConverter 
{ 
    public object Convert (object value, Type targetType, object parameter, 
    #if UWP 
     string language) 
    { 
    #else 
     CultureInfo culture) 
    { 
     // or vice-versa if you need culture rather than language code 
     var language = culture.TwoLetterISOLanguageName ; 
    #endif 
     ... 
    } 
} 
+2

はい、それです。私は、Visual Studio 2015+が[共有プロジェクト](http://dailydotnettips.com/2015/07/28/using-shared-project-across-multiple-applications-in-visual-studio-2015/)をサポートしていると付け加えます。つまり、異なるプロジェクト構成は必要ありません。 netstandardプロジェクトを、WPFプロジェクトとUWPプロジェクトの両方で参照される「共有プロジェクト」に置き換えるだけです。 – Heinzi

関連する問題