我应该使用哪个命名空间和程序集在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"
现在我应该使用什么来使它适用于MixedPlateform,我试过这个但没有成功:
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>
WidthConverter.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
}
}
答案 0 :(得分:2)
请记住共享项目没有可编译的输出。
因此,将不会生成 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项目。
答案 1 :(得分:0)
问问自己.WinPhone
和.Android
的用途。请记住,程序集是类必须引用的名称。 LeMagXam
可能只包含公共元素,而不包含平台的细节。想一想System.Collection
- 该命名空间没有List
或Dictionary
,但System.Collection.Generics
会
宽度转换器有什么作用?如果它只是一个执行一些基本数学的属性(比如将英尺转换为米),那么就不需要在特定于平台的命名空间中使用它。如果它正在设置特定于平台的宽度,那么您再也不需要使用特定于平台的命名空间作为Xam.Forms已经允许您使用Device.OnPlatform
执行此类操作(我认为&# 39; s叫做)方法。
希望这有帮助