【问题标题】:Hyperlink click action and ability to select and copy text超链接点击动作以及选择和复制文本的能力
【发布时间】:2016-02-25 09:11:28
【问题描述】:

我正在C# 中开发一个WPF 应用程序,并且需要用户能够单击超链接(执行命令)但也能够选择文本并复制它。

我搜索了选项,但找不到任何对我有帮助的东西。

目前我的 WPF XAML 中有以下内容:

    <TextBlock Grid.Column="1" Grid.Row="0">
       <Hyperlink Command="{Binding OpenDefaultMailApplicationCommand}" >
       <TextBox Height="20" IsReadOnly="True" Foreground="Blue"         BorderThickness="0">test@test.nl</TextBox>
   </Hyperlink>
    </TextBlock>

我做错了什么?文本是可选择的,只有我无法单击它来执行我的命令。

【问题讨论】:

  • 您想如何区分单击选择和单击执行?
  • 说实话,我不确定。我希望对两者都使用单击,但在后台检查鼠标的位置。如果它在值的前面或末尾,那么用户应该能够选择文本。但是,如果用户在该值上并单击它会执行命令。
  • 通常人们会使用 ctrl+click 进行导航..
  • 通常他们会这样做,但要求是只需单击即可。只有在没有其他办法的情况下,然后 ctrl + click 才可能是一种可能的方式。但是上面的 XAML 是否仍然有效?

标签: c# wpf xaml hyperlink textbox


【解决方案1】:

这是我用于类似需求的。

您需要有一个不可编辑且可点击的文本框。您可以通过下划线和颜色更改等将其设置为超链接。

<TextBox IsReadOnly="True"
                 Background="Transparent"
                 BorderThickness="0"
                 Text="test@test.nl"
                 Height="20"
                 PreviewMouseLeftButtonDown="TextBox_PreviewMouseLeftButtonDown"
                 TextDecorations="Underline"
                 MouseMove="TextBox_MouseMove"
                 Foreground="Blue" />


private void TextBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
        if (Keyboard.IsKeyDown(Key.LeftCtrl))
        {
            MessageBox.Show("CLicked");
        }
}


private void TextBox_MouseMove(object sender, MouseEventArgs e)
{
        var txtBox = sender as TextBox;
        if (Keyboard.IsKeyDown(Key.LeftCtrl))
        {
            txtBox.Cursor = Cursors.Hand;
        }
        else
            txtBox .Cursor = null;
}

【讨论】:

  • 你为什么觉得这很臭?是因为命令的使用方式吗?你的方法是什么?
  • 我只是不喜欢使用事件处理程序和为琐碎的请求操作控件。但可能到目前为止没有其他选择
【解决方案2】:

所以我找到了解决问题的另一种方法。

通过使用富文本框并向其添加超链接,用户可以选择文本但也可以单击它。

           <RichTextBox Name="rtbEmail" Grid.Column="1" Grid.Row="0" Foreground="Blue" BorderThickness="0" 
                                     Margin="3"/>

在“C#”usercontrol.cs 中,我以编程方式设置超链接并向其添加点击事件处理程序。

                FlowDocument doc = new FlowDocument();
            rtbEmail.Document = doc;
            rtbEmail.IsReadOnly = true;
            rtbEmail.IsDocumentEnabled = true;

            Paragraph para = new Paragraph();
            doc.Blocks.Add(para);

            Hyperlink link = new Hyperlink();
            link.IsEnabled = true;
            link.Inlines.Add(DataContext.EmailAddress);

            link.Click += new RoutedEventHandler(this.OpenEmailAppEvent);
            para.Inlines.Add(link);

希望有人对此有用:)。我做到了:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多