2011-10-20 47 views
6

Tôi muốn trình bày một số văn bản trong GUI và cung cấp cho người dùng khả năng nhấp đúp vào văn bản đó. Tôi muốn bắt sự kiện này và giải quyết nó.hiển thị văn bản có thể nhấp WPF

Tôi nghĩ để làm điều đó như thế này:

<TextBlock 
     Height="39" 
     TextElement.FontSize="18" 
     FontFamily="Verdana" 
     HorizontalAlignment="Left" 
     VerticalAlignment="Center" 
     Name="Filelink" 
     Padding="5,0,0,0" 
     TextDecorations="Underline" 
     Text="{Binding Path=FilePath}"/> 

Nhưng dường như nó không phải dễ dàng để đối phó với nhấp chuột trong TextBlock.

Bất kỳ ý tưởng nào là cách tốt nhất để trình bày văn bản có thể nhấp.

Cảm ơn.

+0

Câu hỏi này có tương tự không - http://stackoverflow.com/questions/4022109/wpf-dynamically-created-text-with-clickable-links-in-it-via-binding? – ChrisF

+0

Điều này có gây nhầm lẫn không? Làm thế nào người dùng biết rằng anh ta có thể nhấp đúp vào nó? –

Trả lời

16

Bạn có thể nhúng một hyberlink trong một TextBlock như trong ví dụ này

<TextBlock> 
    <Hyperlink NavigateUri="Reviews.xaml">Click Me </Hyperlink> 
</TextBlock> 

Bạn cũng có thể xử lý các sự kiện siêu liên kết Nhấn vào để gọi Navigate ví dụ

+0

Câu trả lời này không giúp xử lý sự kiện Doubleclick nhưng tôi đã bỏ phiếu vì tôi nghĩ rằng việc sử dụng siêu liên kết là một thực tế tốt để cho thấy rằng văn bản có thể nhấp được. – Ucodia

2

Tại sao bạn không chỉ cần sử dụng một Label và lắng nghe sự kiện MouseDoubleClick (mặc dù tôi đồng ý với bình luận của Xin về khả năng sử dụng)?

1

Nếu sử dụng một Label hoặc một Hyperlink sẽ không làm việc trong tình huống của bạn, bạn có thể lấy cách tiếp cận của một tạo ra một mới có nguồn gốc TextBlock mà chỉ đơn giản định nghĩa một DoubleClick sự kiện mới chuyển mà bong bóng lên qua cây:

public class ClickableTextBlock : TextBlock 
{ 
    #region Overrides 

    protected override void OnMouseLeftButtonDown(System.Windows.Input.MouseButtonEventArgs e) 
    { 
     base.OnMouseLeftButtonDown(e); 

     if (e.ClickCount == 2) 
     { 
      RaiseEvent(new RoutedEventArgs(DoubleClickEvent, this)); 
     } 
    } 

    #endregion 

    #region DoubleClick RoutedEvent 

    public static readonly RoutedEvent DoubleClickEvent = EventManager.RegisterRoutedEvent("DoubleClick", 
     RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ClickableTextBlock)); 

    public event RoutedEventHandler DoubleClick 
    { 
     add { AddHandler(DoubleClickEvent, value); } 
     remove { RemoveHandler(DoubleClickEvent, value); } 
    } 

    #endregion 
} 

Điều khiển này có thể được sử dụng theo cách tương tự như tiêu chuẩn TextBlock của bạn. Trong ví dụ này, nhấp đúp vào TextBlock sẽ nâng cao sự kiện DoubleClick mà sau đó được hành động thuận của phụ huynh StackPanel để bắt đầu một hình ảnh động:

<StackPanel x:Name="myStackPanel" Background="LightGreen"> 
     <StackPanel.Triggers> 
      <EventTrigger RoutedEvent="l:ClickableTextBlock.DoubleClick"> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation Storyboard.TargetProperty="Opacity" 
             Duration="0:0:1" 
             To="0.5" 
             FillBehavior="Stop"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
     </StackPanel.Triggers> 
     <l:ClickableTextBlock HorizontalAlignment="Center" 
           VerticalAlignment="Center" 
           Background="LightPink" 
           Text="Double Click to change parent's opacity" /> 
    </StackPanel> 

Hope this helps!

15

Nếu bạn muốn văn bản nhấp được bạn chỉ có thể kiểu lại cho một Button:

<Button Content="Text here" Click="Click_Handler"> 
    <Button.Template> 
     <ControlTemplate TargetType="{x:Type Button}"> 
      <ContentPresenter /> 
     </ControlTemplate> 
    </Button.Template> 
</Button> 

Xem thêm this question.

+2

Như tôi thấy đây là giải pháp đúng, bởi vì sau đó bạn cũng có thể liên kết các lệnh với nút. khi thao tác một hộp văn bản, bạn sẽ không có điều khiển CommandBindable –

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