WPF mailto MVVM Binding

时间:2016-12-16 08:17:00

标签: c# wpf email hyperlink

美好的一天,

我正在尝试实现一个WPF超链接,它将使用电子邮件地址打开默认的mailclient。多数民众赞成。

现在我浏览了很多例子,但每个例子几乎都使用了一个传递给命令的事件或参数。有没有其他方法可以实现这一目标。电子邮件地址有限?牢记MVVM原则。这就是我所熟悉的:

<TextBlock  Grid.Column="3" HorizontalAlignment="Left" VerticalAlignment="Center">
    <Hyperlink NavigateUri="mailto:someone@someone.com">
        <Run Text="{Binding Email}" />
     </Hyperlink>
</TextBlock>

1 个答案:

答案 0 :(得分:2)

您可以尝试使用转换器,如下所示

<TextBlock Grid.Column="3"
               HorizontalAlignment="Left"
               VerticalAlignment="Center">
        <TextBlock.Resources>
            <local:StringToMailToConverer x:Key="StringToMailToConverer" />
        </TextBlock.Resources>
        <Hyperlink NavigateUri="{Binding Email, Converter={StaticResource StringToMailToConverer}}">
            <Run Text="{Binding Email}" />
        </Hyperlink>
    </TextBlock>

转换器,

 public class StringToMailToConverer : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
       if(value != null)
        {
            if (!string.IsNullOrEmpty(value.ToString()))
            {
                return "mailto:" + value.ToString();
            }
        }
        return string.Empty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

<强>更新 在这种情况下,您可以使用简单的行为

 <TextBlock xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
               Grid.Column="3"
               HorizontalAlignment="Left"
               VerticalAlignment="Center">
        <Hyperlink NavigateUri="{Binding Email}">
            <i:Interaction.Behaviors>
                <local:MailToBehaviour />
            </i:Interaction.Behaviors>
            <Run Text="{Binding Email}" />
        </Hyperlink>
    </TextBlock>

public class MailToBehaviour : Behavior<Hyperlink>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.RequestNavigate += (_, __) =>
        {
            Process.Start("mailto:" + __.Uri);
            __.Handled = true;
        };
    }
}

您需要引用System.Windows.Interactivity程序集