【问题标题】:Link to Open New Email Message in Default E-mail Handler in WPF Application在 WPF 应用程序的默认电子邮件处理程序中打开新电子邮件的链接
【发布时间】:2014-04-11 18:47:13
【问题描述】:

我的目标是基本的:在 WPF 表单上有一个标签/texblock what-have-you,该表单被风格化为一个链接。单击时,控件应在用户的默认电子邮件应用程序中打开一个新的电子邮件撰写窗口。实际打开新电子邮件窗口的代码似乎很简单:

Process.Start("mailto:example@stackoverflow.com?subject=SubjectExample&body=BodyExample ");

但是我在两件事情上遇到了麻烦:

  1. 将“新消息打开”操作绑定到标签点击事件。
  2. 对标签进行样式设置,使其看起来与默认 WPF 超链接完全一样。

【问题讨论】:

    标签: c# wpf email


    【解决方案1】:

    如果你想让样式像超链接一样,为什么不直接使用呢?

    <TextBlock>           
        <Hyperlink NavigateUri="mailto:example@stackoverflow.com?subject=SubjectExample&amp;body=BodyExample" RequestNavigate="OnNavigate">
            Click here
        </Hyperlink>
    </TextBlock>
    

    然后添加:

    private void OnNavigate(object sender, RequestNavigateEventArgs e)
    {
        Process.Start(e.Uri.AbsoluteUri);
        e.Handled = true;
    }
    

    【讨论】:

    • 谢谢。出于某种原因,我的印象是 NavigateUri 属性不知道如何处理 mailto,但显然情况并非如此。
    • 如果SubjectBody 包含字符串&amp; 怎么办?
    • 我不得不使用&amp;amp;body而不是&amp;amp;body,并使用Uri.EscapeDataString(在ViewModel中)转义了主题和正文。如果您直接在 XAML 中执行此操作,则为 YMMV。
    【解决方案2】:

    您可以完全在 XAML 中执行此操作 使用表达式交互调用上述链接。

    首先,导入以下命名空间:

    xmlns:i  = "http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:ei = "http://schemas.microsoft.com/expression/2010/interactions"
    

    然后,像下面这样使用它们:

    <Label Content="Send Email">
      <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseLeftButtonUp">
          <ei:LaunchUriOrFileAction Path="mailto:example@stackoverflow.com" />
        </i:EventTrigger>
      </i:Interaction.Triggers>
    </Label>

    【讨论】:

    • 您使用的命名空间在哪里? ei 是什么?
    • 确保您已安装 Blend,否则您将遇到问题。如果它丢失,请从包管理器控制台运行它:Install-Package Blend.Interctivity.WPF.v4.0
    • 我收到错误消息“ 在 XML 命名空间 xmlns:i="schemas.microsoft.com/expression/2010/interactivity" 中不存在。
    【解决方案3】:

    任何使用 .net 核心的人都可以使用 Reeds 答案,但只需稍作调整

    private void OnNavigate(object sender, RequestNavigateEventArgs e)
            {
                Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri) { UseShellExecute = true });
                e.Handled = true;
            }
    

    您可以在这里看到 .net 核心团队谈论它是一项重大更改 https://github.com/dotnet/runtime/issues/30303

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 2013-08-30
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多