3

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>

「e-mail: johndoe@uni.gr」をクリックして電話でメール アプリを開きたいと思います。私のコードには、はるかに大きなテキストの電子メールを含むこのような状況がかなりの数あります。そのため、この<TextBlock><Run Text=".."/><LineBreak/>...形式を使用しています。

内でハイパーリンクボタンを使用できないことがわかった<Run Text=".."/>ので、何か提案はありますか?

4

4 に答える 4

10

UIにハイパーリンクが必要な場合はHyperlinkBut​​tonが適していますが、一連のテキストにハイパーリンクを埋め込む場合は、ハイパーリンクとともに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:   johndoe@uni.gr</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 = "johndoe@uni.gr";
        emailComposeTask.Show();
    }

幸運を!

于 2013-03-01T00:56:21.970 に答える
4

次のこともできます。

アプリの URI アソシエーションに対して行われるように MapUri() をオーバーロードし、クリック イベントの処理について心配する必要はもうありません。

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);
        }
    }
}
于 2013-11-26T09:28:44.537 に答える
2

さらに簡単:

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"));
}

電子メール アプリを開く以外にも、ランチャーでできることがたくさんあります: http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj662937(v=vs.105).aspx

于 2014-04-01T07:06:29.210 に答える
2

HyperLinkBut​​ton を追加します。

<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();
}
于 2013-02-28T19:31:54.927 に答える