2010-06-29 10 views
9

Sembra che posso formattare un HyperlinkButton nello stesso modo posso formattare un TextBlock:Come posso aggiungere una sottolineatura a un collegamento ipertestuale in Silverlight?

HyperlinkButton hyperlinkButton = new HyperlinkButton(); 
hyperlinkButton.Content = "google"; 
hyperlinkButton.NavigateUri = new Uri("http://www.google.com"); 
hyperlinkButton.TargetName = "blank"; 
hyperlinkButton.Foreground = XamlHelpers.GetColorFromHex("555"); 
hyperlinkButton.TextDecoration = ... //error 
hyperlinkButton.FontWeight = FontWeights.Bold; 

Tuttavia, textDecoration non funziona come in TextBlock. Ottengo una sottolineatura automatica al passaggio del mouse, ma vorrei che avesse una sottolineatura prima del mouseover.

Come aggiungere una sottolineatura a un collegamento ipertestuale in Silverlight?

risposta

15

Se avete solo bisogno di un link statico (nessun effetto mouseover) si dovrebbe semplicemente utilizzare un TextBlock come il contenuto del HyperlinkButton. Poiché HyperlinkButton è un ContentControl, può assumere qualsiasi altro tipo di controllo come contenuto (più che semplici stringhe).

Ecco alcuni XAML che vi porterà un TextBlock sottolineato come il contenuto di un HyperlinkButton:

<HyperlinkButton NavigateUri="http://google.com"> 
     <TextBlock Text="Google" TextDecorations="Underline" /> 
    </HyperlinkButton> 

si dovrebbe essere in grado di creare il TextBlock e impostare la proprietà Nel vostro HyperlinkButton con C# in code- anche dietro se è quello che stai facendo.

Come ha detto David, la modifica del ControlTemplate funzionerà sicuramente per modellare un collegamento ipertestuale a proprio piacimento, ma utilizzando un TextBlock sottolineato reale in quanto il contenuto potrebbe essere più semplice e molto meno XAML se è tutto ciò che devi fare.

+0

Sì, funziona anche nel codice. In effetti, ho inserito TextBlock all'interno di un bordo in modo da poter cambiare anche il colore di sfondo al passaggio del mouse. Questa soluzione consente di avere il pieno controllo della formattazione del collegamento ipertestuale (tranne la casella di messa a fuoco blu). Grazie. –

+0

Per rimuovere Blue Box sull'evento di caricamento: Rectangle rect = linkButton.ChildrenOfType () .Where (i => i.Name.Equals ("FocusVisualElement")) FirstOrDefault(); if (rect! = Null) rect.StrokeThickness = 0; – MSNetDev

5

Modificare il modello di controllo. L'ho strappato via Expression Blend.

<Style x:Key="HyperlinkButtonStyle1" TargetType="HyperlinkButton"> 
      <Setter Property="Foreground" Value="#FF73A9D8"/> 
      <Setter Property="Padding" Value="2,0,2,0"/> 
      <Setter Property="Cursor" Value="Hand"/> 
      <Setter Property="HorizontalContentAlignment" Value="Left"/> 
      <Setter Property="VerticalContentAlignment" Value="Top"/> 
      <Setter Property="Background" Value="Transparent"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="HyperlinkButton"> 
         <Grid Background="{TemplateBinding Background}" Cursor="{TemplateBinding Cursor}"> 
          <VisualStateManager.VisualStateGroups> 
           <VisualStateGroup x:Name="CommonStates"> 
            <VisualState x:Name="Normal"/> 
            <VisualState x:Name="MouseOver"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="UnderlineTextBlock"> 
               <DiscreteObjectKeyFrame KeyTime="0"> 
                <DiscreteObjectKeyFrame.Value> 
                 <Visibility>Visible</Visibility> 
                </DiscreteObjectKeyFrame.Value> 
               </DiscreteObjectKeyFrame> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="Pressed"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="UnderlineTextBlock"> 
               <DiscreteObjectKeyFrame KeyTime="0"> 
                <DiscreteObjectKeyFrame.Value> 
                 <Visibility>Visible</Visibility> 
                </DiscreteObjectKeyFrame.Value> 
               </DiscreteObjectKeyFrame> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="Disabled"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="DisabledOverlay"> 
               <DiscreteObjectKeyFrame KeyTime="0"> 
                <DiscreteObjectKeyFrame.Value> 
                 <Visibility>Visible</Visibility> 
                </DiscreteObjectKeyFrame.Value> 
               </DiscreteObjectKeyFrame> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
           </VisualStateGroup> 
           <VisualStateGroup x:Name="FocusStates"> 
            <VisualState x:Name="Focused"> 
             <Storyboard> 
              <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisualElement"/> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="Unfocused"/> 
           </VisualStateGroup> 
          </VisualStateManager.VisualStateGroups> 
          <TextBlock x:Name="UnderlineTextBlock" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" Text="{TemplateBinding Content}" TextDecorations="Underline" Visibility="Collapsed" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>      
          <TextBlock x:Name="DisabledOverlay" Foreground="#FFAAAAAA" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" Text="{TemplateBinding Content}" Visibility="Collapsed" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Canvas.ZIndex="1"/> 
          <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
          <Rectangle x:Name="FocusVisualElement" IsHitTestVisible="false" Opacity="0" Stroke="#FF6DBDD1" StrokeThickness="1"/> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

modificare la visibilità su questo controllo:

<TextBlock x:Name="UnderlineTextBlock" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" Text="{TemplateBinding Content}" TextDecorations="Underline" Visibility="Collapsed" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>  
+0

Questo è così deludente in XAML per WPF/Silverlight/WP/WinRT che per tale interfaccia utente di base si modifica (potrebbe) dover sostituire l'intero modello di controllo. – Sevenate

Problemi correlati