2009-04-17 19 views
9

Tôi có một RichTextBox WPF với isReadOnly được đặt thành True. Tôi muốn người dùng có thể nhấp vào HyperLinks chứa trong RichTextBox, mà không cần phải giữ lại Ctrl.Nhấp vào Siêu liên kết trong RichTextBox mà không cần giữ CTRL - WPF

Sự kiện nhấp trên HyperLink dường như không kích hoạt trừ khi Ctrl bị tạm ngừng, vì vậy tôi không chắc chắn về cách tiếp tục.

+2

Đã cảm ơn Skeet? Rất khôn lanh! – Anthony

+0

@Anthony, đó là một chữ ký (nhìn vào chính tả) – JaredPar

+1

Hehehe, tôi thực ra là John, nhưng nếu Skeet đi qua, tôi chắc chắn sẽ cảm ơn anh ấy :) –

Trả lời

3

Được quản lý để tìm cách giải quyết vấn đề này, khá nhiều do tai nạn.

Nội dung được tải vào RichTextBox của tôi chỉ được lưu trữ (hoặc được nhập) dưới dạng chuỗi đơn giản. Tôi đã phân lớp RichTextBox để cho phép ràng buộc với thuộc tính Document của nó.

gì có liên quan đến câu hỏi, là tôi có một tình trạng quá tải IValueConverter Chuyển đổi() trông giống như thế này (mã không cần thiết với các giải pháp đã được tước ra):

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; 

này được tôi hành vi tôi muốn (đẩy các chuỗi đơn giản vào RichTextBox và nhận định dạng) và nó cũng dẫn đến các liên kết hoạt động giống như một liên kết bình thường, thay vì một liên kết được nhúng trong tài liệu Word.

+0

Chữ var textSplit được tạo ở đâu và như thế nào? –

+0

Câu trả lời này sẽ có số lượng upvotes cao nhất. –

0

Bạn đã thử xử lý sự kiện MouseLeftButtonDown thay vì sự kiện Nhấp chuột phải không?

17

Tôi đã tìm được giải pháp. Đặt IsDocumentEnabled thành "True" và đặt IsReadOnly thành "True".

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

Khi tôi đã làm điều này, chuột sẽ chuyển thành 'tay' khi tôi di chuột qua văn bản được hiển thị trong thẻ HyperLink. Nhấp mà không giữ điều khiển sẽ kích hoạt sự kiện 'Nhấp'.

Tôi đang sử dụng WPF từ .NET 4. Tôi không biết nếu các phiên bản .NET cũ hơn không hoạt động như tôi đã mô tả ở trên.

+5

điều này có tác dụng phụ không may khi làm cho văn bản không thể chọn được cho mục đích sao chép và dán. – Julien

10

JHubbard80 Câu trả lời là một giải pháp khả thi, đó là cách dễ nhất nếu bạn không cần nội dung được chọn.

Tuy nhiên tôi cần điều đó: P đây là cách tiếp cận của tôi: đặt kiểu cho Hyperlink s bên trong RichTextBox. Điều quan trọng là sử dụng một số EventSetter để làm cho số Hyperlink xử lý sự kiện MouseLeftButtonDown.

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

Và trong codebehind:

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

Nhờ gcores cho inspiaration.

+0

Tôi không nhận được bàn tay, nhưng bất cứ điều gì. Nó hoạt động và thậm chí tốt hơn, cho phép tôi truy cập vào mã điều hướng của siêu liên kết - vì vậy nếu một thư mục không tồn tại, ứng dụng của tôi không bị lỗi! – Darkhydro

+0

Xử lý sự kiện nhấp chuột đã hoạt động đối với tôi.Nó có thể là một thứ Windows 10/WPF 4.5 nhưng nó hoạt động. Cảm ơn. –