我如何解决Xamarin.Forms.Xaml.XamlParseException

时间:2017-03-06 15:35:41

标签: xamarin xamarin.forms imagesource

我也是Xamarin FormsC#的新手。请帮助我摆脱上述问题。

我正在

  

Xamarin.Forms.Xaml.XamlParseException

我正在尝试将所选图片来源的字符串格式添加到CandidateDetails.cs

页面如下:

CandidateDetails.cs

public event PropertyChangedEventHandler PropertyChanged;
private string imageBase64;
public string ImageBase64
{
    get { return imageBase64; }
    set
    {
        imageBase64 = value;
        OnPropertyChanged("ImageBase64");
        CandImage = Xamarin.Forms.ImageSource.FromStream(
            () => new MemoryStream(Convert.FromBase64String(imageBase64)));
    }
}
private Xamarin.Forms.ImageSource _candImage;
public Xamarin.Forms.ImageSource CandImage
{
    get { return _candImage; }
    set
    {
        _candImage = value;
        OnPropertyChanged("CandImage");
    }
}

public string _candName; 
public string CandName
{
    get { return _candName; }
    set
    {
        if (_candName == value)
            return;

        _candName = value;

        OnPropertyChanged("CandName");

    }
}

public string _candInst;
public string CandInst
{
    get { return _candInst; }
    set
    {
        if (_candInst == value)
            return;

        _candInst = value;

        OnPropertyChanged("CandInst");

    }
}

public string _candEmailId;
public string CandEmailId
{
    get { return _candEmailId; }
    set
    {
        if (_candEmailId == value)
            return;

        _candEmailId = value;

        OnPropertyChanged("CandEmailId");

    }
}

public string _candMob;
public string CandMob
{
    get { return _candMob; }
    set
    {
        if (_candMob == value)
            return;

        _candMob = value;

        OnPropertyChanged("CandMob");

    }
}

private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

CandidateDetailsModalPage.xaml.cs

public partial class CandidateDetailsModalPage : ContentPage
{
    Stream input;
    string imageAsString;

public static ObservableCollection<CandidateDetails> _candidate = new ObservableCollection<CandidateDetails>();
async void OnDoneClicked(object sender, System.EventArgs e)
{
    _candidate.Add(new CandidateDetails
        {

            CandName = (string)candNameEntry.Text,
            CandEmailId = (string)candEmailId.Text,
            CandMob = (string)candMobNumber.Text,
            ImageBase64 = imageAsString

        });


        await Navigation.PopModalAsync();

}


public CandidateDetailsModalPage()
{
    InitializeComponent();

    pickPhoto.Clicked += async (sender, args) =>
{
                if (!CrossMedia.Current.IsPickPhotoSupported)
    {
        await DisplayAlert("Photos Not Supported", ":( Permission not granted to photos.", "OK");
        return;
    }
    var file = await CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions
    {
        PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium
    });
                if (file == null)
        return;
                input = file.GetStream();
                byte[] buffer = new byte[16 * 1024];
    using (MemoryStream ms = new MemoryStream())
    {
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            ms.Write(buffer, 0, read);
        }
                imageAsString = Convert.ToBase64String(ms.ToArray());
    }
                //image.Source = ImageSource.FromStream(() => new MemoryStream(Convert.FromBase64String(imageAsString)));
            image.Source = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
file.Dispose();
return stream;
});
            };
        }
    }

CandidateDetailsModalPage.xaml

<StackLayout Orientation="Vertical" BackgroundColor="#3B4371" Padding="0">
        <Button Text="Done" Clicked="OnDoneClicked" />
            <ic:CircleImage x:Name="image"/>
            <Button x:Name="pickPhoto" Text="Pick Photo"/>
            <StackLayout VerticalOptions="FillAndExpand">
            <Entry x:Name="candNameEntry" Placeholder="Candidate Name" />
        <Entry x:Name="candInst" Placeholder="Candidate Institution / Party"/>
        <Entry x:Name="candEmailId" Placeholder="Candidate Email Id"  />
        <Entry x:Name="candMobNumber" Placeholder="Candidate Mobile Number"/>
        </StackLayout>
        </StackLayout>

以下是我显示数据的xaml页面的后端CandidateDisplayPage.xaml.cs

candidateListView.ItemsSource = CandidateDetailsModalPage._candidate; 

CandidateDisplayPage

<ListView x:Name="candidateListView">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout Orientation="Horizontal">
                    <Image x:Name="candImage" ImageSource="{Binding Path=CandImage}"/>
                    <Label Text="{Binding CandName}" x:Name="candName"/>
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

1 个答案:

答案 0 :(得分:1)

您在评论中说(应该是原始报告的一部分):

  

这是导致异常的错误无法分配属性&#34; ImageSource&#34;:属性不存在,或者不可分配,或者值和属性之间的类型不匹配

确实,Image没有ImageSource属性,而是Source类型的ImageSource属性。

public ImageSource Source { get; set; }

所以你的Xaml看起来应该是

Image x:Name="candImage" Source="{Binding Path=CandImage}"/>