2011-10-20 16 views
6

Quiero presentar un texto en la GUI y darle al usuario la capacidad de hacer doble clic en él. Quiero ver este evento y lidiar con él.mostrando texto seleccionable WPF

pensé que hacerlo de esta manera:

<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}"/> 

Pero parece que no es fácil de tratar clics en TextBlock.

Alguna idea de cuál es la mejor manera de presentar un texto que pueda hacer clic.

Gracias.

+0

¿Es esta pregunta similar - http://stackoverflow.com/questions/4022109/wpf-dynamically-created-text-with-clickable-links-in-it-via-binding? – ChrisF

+0

¿No sería esto confuso? ¿Cómo sabría el usuario que puede hacer doble clic en él? –

Respuesta

16

Puede incrustar un hyberlink en un Textblock como se muestra en este ejemplo

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

También puede controlar el evento hipervínculos clic para llamar Navegar por ejemplo

+0

Esta respuesta no ayuda a manejar el evento de DoubleClick, pero voté en alza porque creo que usar un hipervínculo es una buena práctica para mostrar que se puede hacer clic en un texto. – Ucodia

2

¿Por qué no sólo tiene que utilizar un Label y escuchar el evento MouseDoubleClick (aunque estoy de acuerdo con el comentario de Xin sobre la usabilidad)

1

Si se utiliza un Label o una Hyperlink no va a funcionar en su situación, usted podría tomar el acercamiento de una creación de un nuevo derivado TextBlock que simplemente define una nueva DoubleClick evento enrutado, que se propaga hacia arriba a través del árbol:

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 
} 

Este control se puede usar de la misma manera que su estándar TextBlock. En este ejemplo, hacer doble clic en el TextBlock elevará el caso DoubleClick que luego se actúa por el padre StackPanel para iniciar una animación:

<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> 

Espero que esto ayude!

15

Si desea que el texto puede hacer clic usted puede simplemente cambiar el estilo de un Button:

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

Véase también this question.

+2

Como yo lo veo, esta es la solución correcta, porque entonces también puedes vincular comandos al botón. al manipular un cuadro de texto, no tendrá un control CommandBindable –

Cuestiones relacionadas