簡體   English   中英

我應該使用哪個名稱空間和程序集在共享項目中聲明轉換器

[英]Which namespace and assembly should I use to declare a converter in a shared project

我應該使用哪個名稱空間和程序集在Xamarin的共享項目中聲明轉換器。

為此資源

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

如果我選擇Windows Phone作為Startup Project,則此聲明有效:

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

如果我選擇Android作為Startup Project,則此聲明有效:

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

請記住, 共享項目沒有可編譯的輸出。

因此,將不會生成任何裝配體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 (我認為這)方法來執行此類操作。

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM