文本框中的超链接电子邮件地址并通过Outlook发送

时间:2013-08-22 11:06:26

标签: wpf hyperlink email-address

我正在开发一个wpf应用程序,我有一个客户信息部分,我可以记录我的客户信息。在本节中,我使用文本框记录客户的电子邮件地址。但现在我想制作电子邮件地址超链接并通过Outlook电子邮件链接电子邮件地址,例如,如果我点击电子邮件地址,它会自动打开Outlook电子邮件,以便我可以通过outlook发送电子邮件。感谢。

我想要的是标签或文本块,其左侧是文本电子邮件(不需要绑定到文本框中的文本),右侧是可以键入电子邮件的文本框地址。在文本框中键入有效的电子邮件地址后,您可以单击电子邮件地址,它将自动打开Outlook。在Outlook的字段中,电子邮件地址就是您输入的内容。(上一个问题中的评论很长,因此我将其作为一个新问题,旧问题链接为{{3} }

<TextBlock Text="Email" Grid.Row="11" x:Name="lblEmail" VerticalAlignment="Top"/> 
    <TextBox Grid.Column="1" Grid.Row="11" x:Name="txtEmail" VerticalAlignment="Top" 
        TextDecorations="UnderLine" Foreground="Blue" Text="{Binding 
        Email, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, 
        ValidatesOnExceptions=True, NotifyOnValidationError=True}">
</TextBox> 

2 个答案:

答案 0 :(得分:4)

好的,让我们再来一次......首先我们有TextBox用户输入的电子邮件地址:

<TextBox x:Name="EmailTextBox" />

然后我们有一个Hyperlink对象,其NavigateUri属性是绑定到Textbox.Text对象的EmailTextBox字段的数据:

<Hyperlink RequestNavigate="Hyperlink_RequestNavigate" NavigateUri="{Binding Text, 
    ElementName=EmailTextBox, UpdateSourceTrigger=PropertyChanged}">
    <TextBlock Text="Click here to e-mail" />
</Hyperlink>

然后我们有RequestNavigateEvent处理程序来验证电子邮件地址(正则表达式取自this post):

public void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
    Hyperlink hyperlink = sender as Hyperlink;
    if (hyperlink == null) return;
    if (Regex.IsMatch(hyperlink.NavigateUri.ToString(), @"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$"))
    {
        string address = string.Concat("mailto:", hyperlink.NavigateUri.ToString());
        try { System.Diagnostics.Process.Start(address); }
        catch { MessageBox.Show("That e-mail address is invalid.", "E-mail error"); }
    }
}

现在,我仍然无法测试任何这些,所以你可能必须自己修复一些小错误,但这是你必须做的大致。随意添加评论,但这次不要让评论部分大于问题部分。 ;)

更新&gt;&gt;&gt;

好的,问题是hyperlink.NavigateUri实际上是Uri个对象,而不是string,因此我们需要在其上调用ToString()

万一你需要它,你可以用这一行替换Hyperlink_RequestNavigate处理程序中的行来设置电子邮件的主题:

string address = string.Concat("mailto:", hyperlink.NavigateUri.ToString(), 
"?subject=This is the subject");

这可以进一步扩展到添加身体的一部分(或全部):

string address = string.Concat("mailto:", hyperlink.NavigateUri.ToString(), 
"?subject=This is the subject&body=Dear Sir/Madam,");

答案 1 :(得分:0)

您可以尝试使用代码XAML

<TextBlock Name="tbReferAFriend"  MouseDown="tbReferAFriend_MouseDown">Refer a friend</TextBlock>

背后的代码

 private void tbReferAFriend_MouseDown(object sender, MouseButtonEventArgs e)
            {
                try
                {

                   LaunchEmailClientByShellExecute();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message + Environment.NewLine + ex.StackTrace);
                }
            }

    [DllImport("shell32.dll")]
            public static extern IntPtr ShellExecute(IntPtr hwnd, string lpOperation,
                string lpFile, string lpParameters, string lpDirectory, int nShowCmd);

            private void launchEmailClientByShellExecute()
            {
                ShellExecute(IntPtr.Zero, "open", "mailto:username?subject=Read%20This&body=message%20contents", "", "", 4/* sw_shownoactivate */);
            }

来自:https://social.msdn.microsoft.com/Forums/vstudio/en-US/dcbaaced-97b3-4276-bf95-960e77cb6c03/how-to-launch-default-mail-client-in-wpf-applications?forum=wpf