2009-04-23 2 views
78

Come posso fare Pulsante per assomigliare LinkButton, e non voglio usare Hyperlink ... !!pulsante Collegamento in WPF

Qualsiasi suggerimento

+1

Se qualcuno importa, il problema con tutte le risposte qui è che i collegamenti nelle risposte non si comportano in realtà come i collegamenti. Non sono a conoscenza della cronologia dell'URL visitato e i colori non sono i colori dell'URL di sistema. Ma se non hai quei requisiti, stanno bene. – Will

+0

Sto cercando di capire come utilizzare i colori di Windows corretti. http://stackoverflow.com/questions/5094447 –

risposta

131

Se non si desidera che il normale stile Button e desidera solo qualcosa che assomiglia a un collegamento ipertestuale si potrebbe iniziare con questo

<Button Margin="5" Content="Test" Cursor="Hand"> 
    <Button.Template> 
     <ControlTemplate TargetType="Button"> 
      <TextBlock TextDecorations="Underline"> 
       <ContentPresenter /> 
      </TextBlock> 
     </ControlTemplate> 
    </Button.Template> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Setter Property="Foreground" Value="Blue" /> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="true"> 
        <Setter Property="Foreground" Value="Red" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

Ecco lo stesso di uno stile:

<Style 
    x:Key="LinkButton" 
    TargetType="Button"> 
    <Setter 
     Property="Template"> 
     <Setter.Value> 
      <ControlTemplate 
       TargetType="Button"> 
       <TextBlock 
        TextDecorations="Underline"> 
       <ContentPresenter /></TextBlock> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter 
     Property="Foreground" 
     Value="Blue" /> 
    <Style.Triggers> 
     <Trigger 
      Property="IsMouseOver" 
      Value="true"> 
      <Setter 
       Property="Foreground" 
       Value="Red" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

e si può usare in questo modo:

<Button Style="{StaticResource LinkButton}" Content="Clicky" /> 
+0

Si prega di notare che c'è un errore di battitura qui - LinkButon – GarethD

+2

Questa risposta produce un pulsante che ha uno spazio tra la sottolineatura e il testo. @Christians answer risolve questo. –

+0

Anche questo non ha il puntatore "mano" quando si passa il mouse sul collegamento ipertestuale. Utilizzare la risposta wiki della comunità per questa funzionalità. – AlbatrossCafe

1

Perché non si desidera utilizzare il collegamento ipertestuale?

<Button> 
    <Hyperlink> 
</Button> 
+0

Coz, Ogni volta che cerco di ottenere padre nella struttura ad albero visuale viene generata un'eccezione dicendo collegamento ipertestuale non viene visiva o Visual3D –

+0

voglio usare questo. L'ho fatto funzionare ma non riesco a liberarmi dell'ombra sui bordi del pulsante. Come si fa a farlo? –

29

Ecco il suggerimento di MichaC implementato come Style che è possibile riutilizzare su qualsiasi pulsante:

<Style x:Key="LinkButton" TargetType="Button"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <TextBlock TextDecorations="Underline"> 
        <ContentPresenter /> 
       </TextBlock> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Foreground" Value="Blue" /> 
    <Setter Property="Cursor" Value="Hand" /> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="true"> 
      <Setter Property="Foreground" Value="Red" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
+8

fatto di questo un wiki comunità, considerando il 99% di questa risposta è stato rubato da MichaC :) –

29
<Style x:Key="LinkButton" 
     TargetType="Button" 
     BasedOn="{StaticResource ResourceKey={x:Type Button}}" 
     > 

    <Setter Property="Width" Value="Auto"/> 

    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <ContentPresenter Content="{TemplateBinding Content}" 
            ContentTemplate="{TemplateBinding ContentTemplate}" 
            VerticalAlignment="Center" 
            > 
        <ContentPresenter.Resources> 
         <Style TargetType="{x:Type TextBlock}"> 
          <Setter Property="TextDecorations" Value="Underline" /> 
         </Style> 
        </ContentPresenter.Resources> 
       </ContentPresenter> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Foreground" Value="Blue" /> 
    <Setter Property="Cursor" Value="Hand" /> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="true"> 
      <Setter Property="Foreground" Value="Red" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

versione di Anderson di MichaC e collocate la sottolineatura leggermente sbagliato, qui è una versione aggiornata che sarà solo aggiungere una sottolineatura a qualsiasi TextBlock che si trovano all'interno dello ContentPresenter.

+1

Christian: Come mai non riesco a vedere alcuna sottolineatura utilizzando il tuo stile? MichaC ha funzionato bene per me. – newman

+0

Non funziona neanche per me. Lo stile in ContentPresenter.Risorse semplicemente non è sempre applicati a qualsiasi TextBlock all'interno del pulsante – Clyde

+0

OK, il problema sembra essere che lo stile si applica solo a un implicito generato TextBlock – Clyde

9

Il modo più semplice (lo faccio nella mia domanda):

<TextBlock Name="..." 
    Text="..." 
    Cursor="Hand" 
    Foreground="Blue" 
    TextDecorations="Underline" 
    MouseLeftButtonUp=..." 
/> 

avete il pieno controllo su textDecoration, per esempio cambia stile penna o offset. dare un'occhiata a questo link per saperne di più: http://msdn.microsoft.com/en-us/library/system.windows.textdecorations.underline.aspx

+3

cattiva pratica, uno stile a un pulsante Collegamento come suggerito è Molto meglio ... e se hai 50 LinkButtons così? Inoltre, che dire se è necessario aggiungere un'azione Hover o una decorazione diversa? –

+1

Non sono d'accordo con Tomer. "cattiva pratica" implica che non c'è mai bisogno di questo approccio più semplice. In questo momento ho un caso in cui questa era la soluzione perfetta, cioè creare un pulsante in code-behind). Grazie Siavash. –

7

Un'altra soluzione utilizzando Hyperlink è quello di mettere in all'interno TextBlock.

<TextBlock> 
    <Hyperlink Click="..."> 
     <TextBlock Text="Link text" /> 
    </Hyperlink> 
</TextBlock>