【问题标题】:How to have an email link inside a text in Xaml?如何在 Xaml 中的文本中包含电子邮件链接?
【发布时间】:2013-02-28 18:28:01
【问题描述】:

我在 Windows phone 8 应用程序中有一些大文本,我希望里面有电子邮件链接,类似于 mailto 功能。 以下是部分代码:

<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:  johndoe@uni.gr"/>
            </TextBlock>
        </StackPanel>
    </ScrollViewer>
</phone:PivotItem>

我希望“电子邮件:johndoe@uni.gr”可以点击并打开手机上的邮件应用程序。 在我的代码中有很多这样的情况,电子邮件的文本要大得多,这就是我使用 &lt;TextBlock&gt;&lt;Run Text=".."/&gt;&lt;LineBreak/&gt;... 格式的原因。

现在我知道我不能在 &lt;Run Text=".."/&gt; 中使用超链接按钮,所以有什么建议吗?

【问题讨论】:

    标签: c# xaml windows-phone-8 windows-phone


    【解决方案1】:

    HyperlinkBut​​ton 如果你想在你的 UI 中添加一个超链接是很好的,但是如果你想在一段文本中嵌入一个超链接,你应该使用带有 HyperlinkRichTextBox

    <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:   johndoe@uni.gr</Hyperlink>
        </Paragraph>
    </RichTextBox>
    

    然后使用 Julien 回答中的处理程序:

        private void Hyperlink_OnClick(object sender, RoutedEventArgs e) {
            EmailComposeTask emailComposeTask = new EmailComposeTask();
            emailComposeTask.Subject = "message subject";
            emailComposeTask.Body = "message body";
            emailComposeTask.To = "johndoe@uni.gr";
            emailComposeTask.Show();
        }
    

    祝你好运!

    【讨论】:

    • 由于某种原因,RoutedEventArgsshell:ApplicationBarMenuItem 中使用时导致错误。不过EventArgs 工作了。
    【解决方案2】:

    您还可以执行以下操作:

    重载 MapUri(),因为它是为应用程序的 URI-Associations 完成的,不再担心处理任何点击事件。

    XAML:

    <Hyperlink NavigateUri="tel:0800-555-1234'}">call 0800-555-1234</Hyperlink>
    <Hyperlink NavigateUri="mailto:you@your-domain.com'}">e-Mail you@your-domain.com</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);
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      添加一个超链接按钮:

      <HyperlinkButton Name="emailLink" Content="johndoe@uni.gr" 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】:

        更简单:

        XAML:

        <HyperlinkButton Content="yourname@yourdomain.com" Click="HyperlinkButton_Click"/>
        

        点击事件处理程序:

        private void HyperlinkButton_Click(object sender, RoutedEventArgs e)
        {
            Windows.System.Launcher.LaunchUriAsync(new Uri("mailto:yourname@yourdomain.com"));
        }
        

        除了打开您的电子邮件应用程序之外,您还可以使用 Launcher 执行更多操作:http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj662937(v=vs.105).aspx

        【讨论】:

          猜你喜欢
          • 2014-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-08
          • 2023-02-04
          • 1970-01-01
          • 2011-07-15
          • 2010-11-20
          相关资源
          最近更新 更多