16

isReadOnlyに設定されたWPF RichTextBoxがありTrueます。RichTextBox 内に含まれるハイパーリンクを、ユーザーが長押ししなくてもクリックできるようにしたいと考えていますCtrl

HyperLink の Click イベントは、Ctrl長押ししないと発生しないように見えるので、どうすればよいかわかりません。

4

6 に答える 6

30

解決策を見つけました。IsDocumentEnabled を「True」に設定し、IsReadOnly を「True」に設定します。

<RichTextBox IsReadOnly="True" IsDocumentEnabled="True" />

これを行うと、HyperLink タグ内に表示されたテキストにカーソルを合わせると、マウスが「手」に変わります。コントロールを保持せずにクリックすると、'Click' イベントが発生します。

.NET 4 の WPF を使用しています。以前のバージョンの .NET が上記のように機能しないかどうかはわかりません。

于 2011-05-26T23:55:58.597 に答える
16

JHubbard80の回答は可能な解決策です。コンテンツを選択する必要がない場合は、これが最も簡単な方法です。

ただし、 :P ここに私のアプローチが必要です:Hyperlink内の s のスタイルを設定しRichTextBoxます。重要なのは、イベントを処理する sEventSetterを作成するために a を使用することです。HyperlinkMouseLeftButtonDown

<RichTextBox>
    <RichTextBox.Resources>
        <Style TargetType="Hyperlink">
            <Setter Property="Cursor" Value="Hand" />
            <EventSetter Event="MouseLeftButtonDown" Handler="Hyperlink_MouseLeftButtonDown" />
        </Style>
    </RichTextBox.Resources>
</RichTextBox>

コードビハインドでは:

private void Hyperlink_MouseLeftButtonDown(object sender, MouseEventArgs e)
{
    var hyperlink = (Hyperlink)sender;
    Process.Start(hyperlink.NavigateUri.ToString());
}

インスピレーションを与えてくれたgcoresに感謝します。

于 2013-11-24T18:42:15.787 に答える
6

ほとんど偶然に、これを回避する方法を見つけることができました。

RichTextBox に読み込まれたコンテンツは、単純な文字列として保存 (または入力) されます。RichTextBox をサブクラス化して、その Document プロパティに対するバインディングを許可しました。

質問に関連するのは、次のような IValueConverter Convert() オーバーロードがあることです (ソリューションに不可欠ではないコードは削除されています)。

FlowDocument doc = new FlowDocument();
Paragraph graph = new Paragraph();

Hyperlink textLink = new Hyperlink(new Run(textSplit));
textLink.NavigateUri = new Uri(textSplit);
textLink.RequestNavigate += 
  new System.Windows.Navigation.RequestNavigateEventHandler(navHandler);

graph.Inlines.Add(textLink);
graph.Inlines.Add(new Run(nonLinkStrings));

doc.Blocks.Add(graph);

return doc;

これにより、必要な動作 (RichTextBox に単純な文字列を押し込んで書式設定を取得する) が得られ、Word 文書に埋め込まれたリンクではなく、通常のリンクのように動作するリンクになります。

于 2009-04-17T23:18:52.533 に答える
0

Clickイベントの代わりにMouseLeftButtonDownイベントを処理しようとしましたか?

于 2009-04-17T22:52:45.247 に答える
0

If you want to turn Arrow into a Hand cursor always without default system navigation, below is the approach.

<RichTextBox>
            <RichTextBox.Resources>
                <Style TargetType="{x:Type Hyperlink}">                                
                    <EventSetter Event="MouseEnter" Handler="Hyperlink_OnMouseEnter"/>
                </Style>                
            </RichTextBox.Resources>
</RichTextBox>


private void Hyperlink_OnMouseEnter(object sender, MouseEventArgs e)
        {
            var hyperlink = (Hyperlink)sender;
            hyperlink.ForceCursor = true;
            hyperlink.Cursor = Cursors.Hand;
        }
于 2019-11-28T08:59:36.207 に答える