我应该使用哪个命名空间和程序集来声明共享项目中的转换器

本文关键字:共享 声明 项目 转换器 程序集 命名空间 我应该 | 更新日期: 2023-09-27 18:32:21

我应该使用哪个命名空间和程序集来声明 Xamarin 中的共享项目中的转换器。

对于这个资源

 <TabbedPage.Resources>
    <ResourceDictionary>
        <local:WidthConverter x:Key="widthConverter"/>
    </ResourceDictionary>
</TabbedPage.Resources>

如果我选择WindowsPhone作为启动项目,则此声明有效:

 xmlns:local="clr-namespace:LeMagXam;assembly=LeMagXam.WinPhone" 

如果我选择Android作为启动项目,则此声明有效:

 xmlns:local="clr-namespace:LeMagXam;assembly=LeMagXam.Android" 

现在我应该使用什么来使其适用于混合平台,我尝试了这个但没有成功:

 xmlns:local="clr-namespace:LeMagXam;assembly=LeMagXam" 

提前谢谢你。

编辑那里有我的完整代码,以便更好地理解

<?xml version="1.0" encoding="UTF-8"?>
<TabbedPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="LeMagXam.View.HomePage"
xmlns:local="clr-namespace:LeMagXam;assembly=LeMagXam"
Title="LeMag"
BackgroundImage="bg_light.png"
ItemsSource="{Binding CategoriesList}"
>
<TabbedPage.Resources>
    <ResourceDictionary>
        <local:WidthConverter x:Key="widthConverter"/>
    </ResourceDictionary>
</TabbedPage.Resources>

<TabbedPage.ItemTemplate>
    <DataTemplate>
        <ContentPage Title="{Binding Name}">
<-- ... -->
        <Image Source="{Binding Category.ImageArticleTitle.Source}" HorizontalOptions="Start"
               WidthRequest="{Binding , Converter={StaticResource widthConverter},
                               ConverterParameter=150}"
<-- ... -->
        </ContentPage>
    </DataTemplate>
</TabbedPage.ItemTemplate>
</TabbedPage>

宽度转换器.cs

namespace LeMagXam
{
    public class WidthConverter : IValueConverter
    {
        #region IValueConverter implementation
        public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return (double)parameter * App.RatioWidth;
        }
        public object ConvertBack (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException ();
        }
        #endregion
    }
}

我应该使用哪个命名空间和程序集来声明共享项目中的转换器

请记住,共享项目没有可编译的输出。

因此,不会生成任何程序集 LeMagXam

而是将共享项目的内容编译引用它的项目中。

因此,正如您提到的,以下内容都将在自己的特定于平台的项目中工作:

xmlns:local="clr-namespace:LeMagXam;assembly=LeMagXam.WinPhone" 
xmlns:local="clr-namespace:LeMagXam;assembly=LeMagXam.Android" 

要解决此问题,您可以只使用:-

xmlns:local="clr-namespace:LeMagXam" 

如果这不起作用,请考虑创建一个 PCL 项目并将转换器放在其中。

PCL 项目具有可编译的输出。 因此,您将能够在使用相同输出程序集的所有 XAML 页面上使用相同的声明,如下所示:

xmlns:local="clr-namespace:LeMagXam;assembly=LeMagXamPCL" 

请记住从特定于平台的项目引用 PCL 项目

问问自己.WinPhone.Android有什么用。请记住,程序集是类必须引用的名称。 LeMagXam可能只包含通用元素,而不包含平台的细节。想想System.Collection - 该命名空间没有ListDictionary,但System.Collection.Generics

宽度转换器有什么作用?如果它只是一个执行一些基本数学运算的属性(例如将英尺转换为米),则不需要在特定于平台的命名空间中具有此属性。如果它设置了特定于平台的宽度,那么您同样不需要使用特定于平台的命名空间,因为 Xam.Forms 已经允许您使用 Device.OnPlatform(我认为它被称为)方法执行此类操作。

希望这有帮助