2011-10-20 14 views
6

Voglio presentare del testo nella GUI e dare all'utente la possibilità di fare doppio clic su di esso. Voglio prendere questo evento e affrontarlo.visualizzazione testo cliccabile WPF

ho pensato di farlo in questo modo:

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

ma sembra che non è facile trattare con gli scatti in TextBlock.

Qualche idea qual è il modo migliore per presentare un testo cliccabile.

Grazie.

+0

Questa domanda è simile - http://stackoverflow.com/questions/4022109/wpf-dynamically-created-text-with-clickable-links-in-it-via-binding? – ChrisF

+0

Non sarebbe confuso? Come saprebbe l'utente che può fare doppio clic su di esso? –

risposta

16

È possibile incorporare un hyberlink in un blocco di testo, come illustrato in questo esempio

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

È inoltre possibile gestire l'evento collegamenti ipertestuali Click to Call Naviga per esempio

+0

Questa risposta non è di aiuto nella gestione dell'evento Doubleclick, ma l'ho upvoted perché penso che l'utilizzo di un collegamento ipertestuale sia una buona pratica per mostrare che un testo è selezionabile. – Ucodia

2

Perché non basta usare un Label e ascolta l'evento MouseDoubleClick (anche se sono d'accordo con il commento di Xin sull'usabilità)?

1

Se si utilizza un Label o un Hyperlink non funziona nella vostra situazione, si potrebbe prendere l'avvicinarsi di una creazione di un nuovo derivato TextBlock che definisce semplicemente una nuova DoubleClick evento indirizzato che sgorga attraverso l'albero:

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 
} 

Questo controllo può essere utilizzato allo stesso modo dello standard TextBlock. In questo esempio, fare doppio clic sul TextBlock alzerà l'evento DoubleClick che viene poi dato seguito da parte del genitore StackPanel per avviare un'animazione:

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

Spero che questo aiuti!

15

Se si desidera che il testo cliccabile si può solo restyling un Button:

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

vedere anche this question.

+2

Come vedo io questa è la soluzione giusta, perché in questo caso puoi anche associare i comandi al pulsante. quando si manipola una casella di testo non si avrà un controllo CommandBindable –