如果我想在 WPF 和 UWP 项目中使用 IValueConverter,最佳做法是什么
What is the best practise if I want to use a IValueConverter in WPF and UWP projects
我有一个 UWP 项目和一个 WPF 项目。两个项目都需要相同的转换器。但是 Interface IValueConverter
在 UWP 中与 WPF 中一样在另一个命名空间中,而且最后一个参数不一样(在 WPF 中它是 CultureInfo 在 UWP 中它是一个字符串)。
那么为这两个项目创建转换器的最佳做法是什么?
我的解决方案 是我有一个 netstandard 项目,它有一个 class ValueConverterBase,它定义了来自 UWP 的 WPF IValueConverter 和 IValueConverter 的每两个方法。它还定义了特定转换器必须实现的两个抽象方法:
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);
}
现在我可以在执行逻辑的 netstandard 项目中创建一个转换器。为了能够在 UWP 和 WPF 中使用此转换器,每个项目都必须创建一个 class,它派生自转换器和特定的 IValueConverter:
public class WpfConverter : CommonConverter, IValueConverter
{
}
public class UwpConverter : CommonConverter, IValueConverter
{
}
这个解决方案的问题我必须为每个转换器添加三个新的 classes。此外,每个开发人员都必须了解此解决方法。
另一点是我无法在转换器中使用 WPF 或 UWP 特定逻辑。有人有其他解决方案吗?
新解
我将我的第一个解决方案与@Anton Tykhyy 和@Heinzi 的答案相结合。
我创建了一个包含我的转换器的共享项目,并在其中添加了我的 ValueConverterBase:
public abstract class ValueConverterBase
#if UWP
: Windows.UI.Xaml.Data.IValueConverter
#endif
#if WPF
: System.Windows.Data.IValueConverter
#endif
{ ...
我只使用预处理器并共享源代码而不是程序集。如果您想将转换器放入单独的程序集中,您可以使用不同的项目配置在同一源中构建 WPF 和 UWP 程序集。 #if
不是世界上最优雅的工具,但它可以完成工作,并且您有一个文件和一个 class。制作一个示例转换器并让您的所有开发人员复制它。
#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
...
}
}
我有一个 UWP 项目和一个 WPF 项目。两个项目都需要相同的转换器。但是 Interface IValueConverter
在 UWP 中与 WPF 中一样在另一个命名空间中,而且最后一个参数不一样(在 WPF 中它是 CultureInfo 在 UWP 中它是一个字符串)。
那么为这两个项目创建转换器的最佳做法是什么?
我的解决方案 是我有一个 netstandard 项目,它有一个 class ValueConverterBase,它定义了来自 UWP 的 WPF IValueConverter 和 IValueConverter 的每两个方法。它还定义了特定转换器必须实现的两个抽象方法:
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);
}
现在我可以在执行逻辑的 netstandard 项目中创建一个转换器。为了能够在 UWP 和 WPF 中使用此转换器,每个项目都必须创建一个 class,它派生自转换器和特定的 IValueConverter:
public class WpfConverter : CommonConverter, IValueConverter
{
}
public class UwpConverter : CommonConverter, IValueConverter
{
}
这个解决方案的问题我必须为每个转换器添加三个新的 classes。此外,每个开发人员都必须了解此解决方法。 另一点是我无法在转换器中使用 WPF 或 UWP 特定逻辑。有人有其他解决方案吗?
新解
我将我的第一个解决方案与@Anton Tykhyy 和@Heinzi 的答案相结合。 我创建了一个包含我的转换器的共享项目,并在其中添加了我的 ValueConverterBase:
public abstract class ValueConverterBase
#if UWP
: Windows.UI.Xaml.Data.IValueConverter
#endif
#if WPF
: System.Windows.Data.IValueConverter
#endif
{ ...
我只使用预处理器并共享源代码而不是程序集。如果您想将转换器放入单独的程序集中,您可以使用不同的项目配置在同一源中构建 WPF 和 UWP 程序集。 #if
不是世界上最优雅的工具,但它可以完成工作,并且您有一个文件和一个 class。制作一个示例转换器并让您的所有开发人员复制它。
#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
...
}
}