Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果我想在WPF和UWP项目中使用IValueConverter,最好的做法是什么_C#_Wpf_Uwp_Ivalueconverter - Fatal编程技术网

C# 如果我想在WPF和UWP项目中使用IValueConverter,最好的做法是什么

C# 如果我想在WPF和UWP项目中使用IValueConverter,最好的做法是什么,c#,wpf,uwp,ivalueconverter,C#,Wpf,Uwp,Ivalueconverter,我有一个UWP项目和一个WPF项目。两个项目都需要相同的转换器。但是接口IValueConverter在WPF中的另一个名称空间的UWP中,而且最后一个参数也不相同(在WPF中是CultureInfo,在UWP中是字符串)。 那么,为这两个项目创建转换器的最佳实践是什么 我的解决方案是我有一个netstandard项目,它有一个类ValueConverterBase,它定义了WPF IValueConverter和UWP的IValueConverter中的每两个方法。它还定义了SEPICFIC转

我有一个UWP项目和一个WPF项目。两个项目都需要相同的转换器。但是接口
IValueConverter
在WPF中的另一个名称空间的UWP中,而且最后一个参数也不相同(在WPF中是CultureInfo,在UWP中是字符串)。 那么,为这两个项目创建转换器的最佳实践是什么

我的解决方案是我有一个netstandard项目,它有一个类ValueConverterBase,它定义了WPF IValueConverter和UWP的IValueConverter中的每两个方法。它还定义了SEPICFIC转换器必须实现的两种抽象方法:

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中使用此转换器,每个项目必须创建一个派生自转换器和特定IValueConverter的类:

public class WpfConverter : CommonConverter, IValueConverter
{
}

public class UwpConverter : CommonConverter, IValueConverter
{
}
这个解决方案的问题是,我必须为每个转换器添加三个新类。此外,每个开发人员都必须了解这种变通方法。 另一点是,我无法在转换器中使用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
不是世界上最优雅的工具,但它可以完成这项工作,而且您有一个文件和一个类。制作一个示例转换器,并让所有开发人员复制它

#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
        ...
    }
}

我只想使用预处理器和共享源代码,而不是程序集。如果要将转换器放入单独的程序集中,可以使用不同的项目配置从同一个源构建WPF和UWP程序集
#if
不是世界上最优雅的工具,但它可以完成这项工作,而且您有一个文件和一个类。制作一个示例转换器,并让所有开发人员复制它

#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
        ...
    }
}

是的,就是这样。我要补充的是Visual Studio 2015+支持,即您不需要不同的项目配置。您只需将netstandard项目替换为“共享项目”,WPF和UWP项目都引用了该项目。是的,就是这样。我要补充的是Visual Studio 2015+支持,即您不需要不同的项目配置。您只需将netstandard项目替换为一个“共享项目”,由WPF和UWP项目引用。