2013-02-28 4 views
2

У меня есть несколько больших текстов в приложении для телефона Windows 8, и я хочу, чтобы внутри него были ссылки электронной почты, что-то вроде функции mailto. Вот часть кода:Как получить ссылку по электронной почте внутри текста в Xaml?

<phone:PivotItem Header="μέλη ΔΕΠ"> 
    <ScrollViewer> 
     <StackPanel> 
      <TextBlock TextWrapping="Wrap">      
      <Run Text="John Doe"/> 
      <LineBreak/> 
      <Run Text="503 (Building DS 126)"/> 
      <LineBreak/> 
      <Run Text="tel.: +30 210-1234567"/> 
      <LineBreak/> 
      <Run Text="e-mail: [email protected]"/> 
      </TextBlock> 
     </StackPanel> 
    </ScrollViewer> 
</phone:PivotItem> 

Я хотел бы «по электронной почте: [email protected]», чтобы быть интерактивными и открыть почтовое приложение на телефоне. В моем коде есть довольно много ситуаций, таких как электронная почта в гораздо большем тексте, поэтому я использую формат <TextBlock><Run Text=".."/><LineBreak/>....

Теперь я знаю, что я не могу использовать кнопку гиперссылки внутри <Run Text=".."/>, поэтому любые предложения?

ответ

10

HyperlinkButton хорошо, если вы хотите гиперссылку в вашем пользовательском интерфейсе, но если вы хотите гиперссылку, встроенную в пробег текста, вы должны использовать RichTextBox с Гиперссылка:

<RichTextBox TextWrapping="Wrap"> 
    <Paragraph> 
     <Run Text="John Doe" /> 
     <LineBreak /> 
     <Run Text="503 (Building DS 126)" /> 
     <LineBreak /> 
     <Run Text="tel.: +30 210-1234567" /> 
     <LineBreak /> 
     <Hyperlink Click="Hyperlink_OnClick">e-mail: [email protected]</Hyperlink> 
    </Paragraph> 
</RichTextBox> 

И затем использовать обработчик от ответа Жюльена:

private void Hyperlink_OnClick(object sender, RoutedEventArgs e) { 
     EmailComposeTask emailComposeTask = new EmailComposeTask(); 
     emailComposeTask.Subject = "message subject"; 
     emailComposeTask.Body = "message body"; 
     emailComposeTask.To = "[email protected]"; 
     emailComposeTask.Show(); 
    } 

Удачи!

+0

Спасибо, что сработало отлично! –

+0

По какой-то причине 'RoutedEventArgs' вызывал ошибку при использовании в' shell: ApplicationBarMenuItem'. Однако EventArgs работал. – doubleJ

2

Добавить HyperlinkButton:

<HyperlinkButton Name="emailLink" Content="[email protected]" Click="EmailLink_Click" /> 

и EmailLink_Link, вы можете запустить EmailComposeTask (http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh394003(v=vs.105).aspx)

private void EMailLink_Click(object sender, RoutedEventArgs e) 
{ 
    EmailComposeTask emailComposeTask = new EmailComposeTask(); 
    emailComposeTask.Subject = "message subject"; 
    emailComposeTask.Body = "message body"; 
    emailComposeTask.To = emailLink.Content; 
    emailComposeTask.Show(); 
} 
4

Вы также можете сделать следующее:

перегрузки MapUri(), как это не делается для URI-ассоциаций в App и не беспокоиться о каких-либо обработки события щелчка больше.

XAML:

<Hyperlink NavigateUri="tel:0800-555-1234'}">call 0800-555-1234</Hyperlink> 
<Hyperlink NavigateUri="mailto:[email protected]'}">e-Mail [email protected]</Hyperlink> 

C# App.xaml.cs

private void InitializePhoneApplication() { 

...

//get ready for URI association 
RootFrame.UriMapper = new AssociationUriMapper(); 

}

C#

class AssociateioniMapper : UriMapperBase 
{ 
public override Uri MapUri(Uri uri) 
{ 
    tempUri = System.Net.HttpUtility.UrlDecode(uri.ToString()); 

    Uri retUri = uri; 
    //handle known uri schemes 
    if (uriUsesKnownScheme(uri)) 
    { 
     Debug.WriteLine("Known Uri scheme: " + uri.Scheme); 
     NavigateConsideringKnownScheme(uri); 
     retUri = null; 
    } 
} 

private bool uriUsesKnownScheme(Uri uri) 
{ 
     try 
     { 
      switch (uri.Scheme) 
      { 
       case "http": 
       case "https": 
       case "mailto": 
       case "tel": 
        return true; 

       default: 
        return false; 
      } 
     } 
     catch (Exception) 
     { 
      //uri does not have a scheme 
      return false; 
     } 

} 

private void NavigateConsideringKnownScheme(Uri uri) 
    { 
     try 
     { 
      switch (uri.Scheme) 
      { 
       case schemeHttp: 
       case schemeHttps: 
        //open URI in IE 
        WebBrowserTask webBrowserTask = new WebBrowserTask(); 
        webBrowserTask.Uri = uri; 
        webBrowserTask.Show(); 
        break; 
       case schemeMailto: 
        //initiate eMail task 
        if (! string.IsNullOrWhiteSpace(uri.Query)) 
         handleMailtoUrl_Query(uri.Query); 
        else 
         handleMailtoUrl_To(uri.OriginalString.Replace("mailto:", string.Empty)); 
        break; 
       case schemeTel: 
        //initiate phonecall task 
        handleTel(uri.PathAndQuery); 
        break; 
       default: 
        break; 
      } 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex.Message); 
     } 
    } 

    private void handleTel(string parameter) 
    { 
     try 
     { 
      string p = parameter as string; 

      string number = p; 
      string displayName = string.Empty; 

      number = Regex.Replace(number, "[^+0-9]", ""); 

      startPhoneCall(number, displayName); 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
    } 

    private void startPhoneCall(string number, string displayName) 
    { 
     try 
     { 
      PhoneCallTask phoneCallTask = new PhoneCallTask(); 

      phoneCallTask.PhoneNumber = number; 
      if (!string.IsNullOrWhiteSpace(displayName)) 
      { 
       phoneCallTask.DisplayName = displayName; 
      } 

      phoneCallTask.Show(); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(LocalizationHelper.GetString("ContactPhonecallError")); 
     } 
    } 

    private void handleMailtoUrl_Query(string query) 
    { 
     //handle subject, to, body and other parameters if required 
    } 

    private void handleMailtoUrl_To(string to) 
    { 
     try 
     { 
      EmailComposeTask emailComposeTask = new EmailComposeTask(); 

      emailComposeTask.To = to; 

      emailComposeTask.Show(); 
     } 
     catch (Exception e) 
     { 
      Debug.WriteLine(e.Message); 
     } 
    } 
} 
+0

Очень хорошее решение! – ecth

1

Еще проще:

XAML:

<HyperlinkButton Content="[email protected]" Click="HyperlinkButton_Click"/> 

Нажмите обработчик события:

private void HyperlinkButton_Click(object sender, RoutedEventArgs e) 
{ 
    Windows.System.Launcher.LaunchUriAsync(new Uri("mailto:[email protected]")); 
} 

Помимо открытия вашего электронного приложения, есть намного больше вы можете сделать с запуском: http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj662937(v=vs.105).aspx

Смежные вопросы