2017-03-03 1 views
0

그래서 필자는 휴대용 클래스 라이브러리에 만든이 xml 파일을 메일에 직접 첨부하여 Messaging PlugIn을 사용하여 보내야합니다. 문제는 .WithAttachment()가 PCL에서 지원되지 않기 때문에 DependencyService를 사용하여이 문제를 해결할 수 있는지 묻고 싶었습니다. 그렇다면 어떻게해야합니까?Xamarin PCL의 Messaging PlugIn (Carel Lotz)?

UWP 클래스에서 .WithAttachment()를 반환 할 수 있습니까 (UWP는 대상 플랫폼 임). UWP의 .WithAttachment() 오버로드가 .WithAttachment (IStorageFile 파일)이라는 것을 읽었 기 때문에 충돌이 없습니까?

private void Senden_Clicked(object sender, EventArgs e) 
     { 
      var emailMessenger = CrossMessaging.Current.EmailMessenger; 
      if (emailMessenger.CanSendEmail) 
      { 
       var email = new EmailMessageBuilder() 
        .To("[email protected]") 
        .Subject("Test") 
        .Body("Hello there!") 
        //.WithAttachment(String FilePath, string ContentType) overload showing in PCL 
        //.WithAttachment(IStorageFile file) overload for the UWP according to the documentation 
        .Build(); 
       emailMessenger.SendEmail(email); 
      } 

     } 

편집 : 버튼 클릭을 통해 첨부 파일이 포함 된 이메일을 보낼 수 있도록 닉 저우의 대답은 조금 수정할 수있었습니다

. 이것에

var picker = new Windows.Storage.Pickers.FileOpenPicker 
    { 
     ViewMode = Windows.Storage.Pickers.PickerViewMode.List, 
     SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary 
    }; 
    picker.FileTypeFilter.Add("*"); 

: 그런 다음 응용 프로그램의 로컬 폴더 대신 문서 라이브러리 내부의 파일을 작성해야 물론

StorageFolder sf = ApplicationData.Current.LocalFolder; 
      var file = await sf.GetFileAsync("daten.xml"); 

난 그냥 코드의 평화를 변경했습니다.

답변

1

문제는 .WithAttachment()가 PCL에서 지원되지 않으므로 DependencyService를 사용하여이 문제를 해결할 수 있는지 묻고 싶습니다. 그렇다면 어떻게해야합니까?

물론 DependencyService을 사용하여 attactment와 함께 이메일을 전송할 수 있습니다. 하지만 코드가 두 개인 interface을 만들 수 있습니다. UWP 프로젝트

SendEmail 인터페이스

public interface IMessageEmail 
    { 
     void SendEmailMehod(string address, string subject, string body, StorageFile attactment = null); 
    } 

IMessageEmail 구현입니다. 당신이 .WithAttachment(attactment) 매개 변수를 볼 수 있듯이

public void SendEmailMehod(string address, string subject, string body, StorageFile attactment = null) 
{ 
    var emailMessenger = CrossMessaging.Current.EmailMessenger; 
    if (emailMessenger.CanSendEmail) 
    { 
     if (attactment != null) 
     { 
      var email = new EmailMessageBuilder() 
     .To(address) 
     .Subject(subject) 
     .Body(body) 
     .WithAttachment(attactment) 
     .Build(); 
      emailMessenger.SendEmail(email); 
     } 
     else 
     { 
      var email = new EmailMessageBuilder() 
     .To(address) 
     .Subject(subject) 
     .Body(body) 
     .Build(); 
      emailMessenger.SendEmail(email); 
     } 
    } 
} 

IStorageFile입니다. 따라서 메서드에 파일을 전달해야합니다. 따라서 다른 DependencyService을 만들 수 있습니다. UWP 프로젝트

IFilePicker 인터페이스

public interface IFilePicker 
    { 
     Task<StorageFile> getFileAsync(); 
    } 

IMessageEmail 구현입니다.

public async Task<StorageFile> getFileAsync() 
{ 
    var picker = new Windows.Storage.Pickers.FileOpenPicker 
    { 
     ViewMode = Windows.Storage.Pickers.PickerViewMode.List, 
     SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary 
    }; 
    picker.FileTypeFilter.Add("*"); 

    var file = await picker.PickSingleFileAsync(); 

    if (file != null) 
    { 
     return file; 
    } 

    return null; 
} 

시도해 볼 수 있습니다. project github에 업로드했습니다.

+0

고맙습니다. 선생님! 파일을 자동으로 가져 오거나 기본 위치를 DocumentsLibrary로 설정하는 방법이 있는지 알고 있습니까? 'SuggestedStartLocation'은 DocumentsLibrary로 설정하지 않기 때문에 (문서에 따르면 사용자가 선택한 폴더 또는 그와 비슷한 것을 기억합니다). – RoloffM

+0

@ 닉 좋아, 이제 알았어! 그리고 선생님, 진짜 MVP입니다! 고맙습니다. <3 – RoloffM