2010-01-19 42 views
23

Chúc mừng, 1 có một số văn bản trên một DB và nó là như sau:Thêm siêu liên kết đến WPF WPF

cà rốt lorem ipsum, súp cà chua sinh thái. Duis khu vực nisl, sollicitudin eu, và rung động ac, tempor sed Sapien. muốn những đứa trẻ ngồi thẳng đứng trong một nồi sẽ luôn luôn là quan trọng. Duis mềm, vào những thời điểm như Minneapolis-miễn phí, massa tellus posuere tạm thời, feugiat elit Tempus các hồ và không có bóng đá. Trình bày như là một tiện nghi. ** [ a href = 'http://somesite.com'] Một số trang web [/ a] ** khuyến cáo nhưng không nhiều khối kể chuyện truyền hình và salad. Một chiếc thuyền, và Ipsum hoặc tác giả ghét

Câu hỏi của tôi là: Làm thế nào có thể hiển thị một Hyperlink trên 1 TextBlock? 1 không muốn sử dụng một điều khiển WebBrowser cho mục đích này. 1 không muốn sử dụng điều khiển này một trong hai: http://www.codeproject.com/KB/WPF/htmltextblock.aspx cũng

Trả lời

13

Bạn có thể sử dụng Regex với bộ chuyển đổi giá trị trong tình huống như vậy.

này sử dụng cho các yêu cầu của bạn (ý tưởng ban đầu từ here):

private Regex regex = 
     new Regex(@"\[a\s+href='(?<link>[^']+)'\](?<text>.*?)\[/a\]", 
     RegexOptions.Compiled); 

này sẽ phù hợp tất cả các liên kết trong chuỗi của bạn có chứa các liên kết, và làm cho 2 nhóm được đặt tên cho mỗi trận đấu: linktext

bây giờ bạn có thể lặp qua tất cả các trận đấu. Mỗi trận đấu sẽ cho bạn một

foreach (Match match in regex.Matches(stringContainingLinks)) 
    { 
     string link = match.Groups["link"].Value; 
     int link_start = match.Groups["link"].Index; 
     int link_end = match.Groups["link"].Index + link.Length; 

     string text = match.Groups["text"].Value; 
     int text_start = match.Groups["text"].Index; 
     int text_end = match.Groups["text"].Index + text.Length; 

     // do whatever you want with stringContainingLinks. 
     // In particular, remove whole `match` ie [a href='...']...[/a] 
     // and instead put HyperLink with `NavigateUri = link` and 
     // `Inlines.Add(text)` 
     // See the answer by Stanislav Kniazev for how to do this 
    } 

Lưu ý: sử dụng logic này trong chuyển đổi giá trị tùy chỉnh ConvertToHyperlinkedText của bạn.

+0

Đây là một câu trả lời tuyệt vời, cảm ơn bạn Mihir –

+0

Bạn đang chào đón! [:)] – mg007

76

hiển thị là khá đơn giản, điều hướng là một câu hỏi khác. XAML đi như thế này:

<TextBlock Name="TextBlockWithHyperlink"> 
    Some text 
    <Hyperlink 
     NavigateUri="http://somesite.com" 
     RequestNavigate="Hyperlink_RequestNavigate"> 
     some site 
    </Hyperlink> 
    some more text 
</TextBlock> 

và xử lý sự kiện mà ra mắt trình duyệt mặc định của bạn để điều hướng đến các siêu liên kết sẽ là:

private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) { 
    System.Diagnostics.Process.Start(e.Uri.ToString()); 
} 

Edit: bạn phải làm điều đó với các văn bản từ cơ sở dữ liệu bạn sẽ phải phân tích các văn bản bằng cách nào đó. Một khi bạn biết những phần văn bản và phần siêu liên kết, bạn có thể xây dựng nội dung WPF động trong các mã:

TextBlockWithHyperlink.Inlines.Clear(); 
TextBlockWithHyperlink.Inlines.Add("Some text "); 
Hyperlink hyperLink = new Hyperlink() { 
    NavigateUri = new Uri("http://somesite.com") 
}; 
hyperLink.Inlines.Add("some site"); 
hyperLink.RequestNavigate += Hyperlink_RequestNavigate; 
TextBlockWithHyperlink.Inlines.Add(hyperLink); 
TextBlockWithHyperlink.Inlines.Add(" Some more text"); 
+1

yes..but như 1 1 đã viết liên kết này bao gồm trong một số văn bản được lưu trữ trong DB. 1 thì muốn đọc các văn bản và thêm các siêu liên kết thích hợp khi cần thiết giải thích –

+0

Stanislav Cảm ơn rất rõ ràng về các siêu liên kết trong WPF –

+0

Thanks, điều này làm việc tuyệt vời! – BVB

Các vấn đề liên quan