【问题标题】:WPF mailto MVVM BindingWPF mailto MVVM 绑定
【发布时间】:2017-05-01 23:44:51
【问题描述】:

美好的一天,

我正在尝试实现一个 WPF 超链接,它将使用电子邮件地址打开默认邮件客户端。就是这样。

现在我浏览了许多示例,但每个示例几乎都使用一个事件或参数传递给命令。有没有其他方法可以实现这一点。电子邮件地址是有界的?牢记 MVVM 原则。这是我到目前为止所得到的:

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

【问题讨论】:

    标签: c# wpf email hyperlink


    【解决方案1】:

    你可以试试下面的转换器,

    <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 程序集

    【讨论】:

    • 是的,我试过了,但是缺少打开默认邮件客户端的功能。将 NavigateUri 设置为“mailto:someone@someone.com”不会自动实现打开邮件客户端的功能。
    猜你喜欢
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    相关资源
    最近更新 更多