isReadOnly
に設定されたWPF RichTextBoxがありTrue
ます。RichTextBox 内に含まれるハイパーリンクを、ユーザーが長押ししなくてもクリックできるようにしたいと考えていますCtrl。
HyperLink の Click イベントは、Ctrl長押ししないと発生しないように見えるので、どうすればよいかわかりません。
isReadOnly
に設定されたWPF RichTextBoxがありTrue
ます。RichTextBox 内に含まれるハイパーリンクを、ユーザーが長押ししなくてもクリックできるようにしたいと考えていますCtrl。
HyperLink の Click イベントは、Ctrl長押ししないと発生しないように見えるので、どうすればよいかわかりません。
解決策を見つけました。IsDocumentEnabled を「True」に設定し、IsReadOnly を「True」に設定します。
<RichTextBox IsReadOnly="True" IsDocumentEnabled="True" />
これを行うと、HyperLink タグ内に表示されたテキストにカーソルを合わせると、マウスが「手」に変わります。コントロールを保持せずにクリックすると、'Click' イベントが発生します。
.NET 4 の WPF を使用しています。以前のバージョンの .NET が上記のように機能しないかどうかはわかりません。
JHubbard80の回答は可能な解決策です。コンテンツを選択する必要がない場合は、これが最も簡単な方法です。
ただし、 :P ここに私のアプローチが必要です:Hyperlink
内の s のスタイルを設定しRichTextBox
ます。重要なのは、イベントを処理する sEventSetter
を作成するために a を使用することです。Hyperlink
MouseLeftButtonDown
<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に感謝します。
ほとんど偶然に、これを回避する方法を見つけることができました。
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 文書に埋め込まれたリンクではなく、通常のリンクのように動作するリンクになります。
Clickイベントの代わりにMouseLeftButtonDownイベントを処理しようとしましたか?
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;
}