2010-06-29 20 views
9

Parece que puedo dar formato a un HyperlinkButton de la misma manera que puedo dar formato a un TextBlock:¿Cómo puedo agregar un subrayado a un HyperlinkButton en 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; 

Sin embargo, textDecoration no funciona como lo hace en TextBlock. Obtengo un subrayado automático al pasar el ratón, pero me gustaría tener un subrayado antes de pasar el mouseover también.

¿Cómo puedo agregar un subrayado a un HyperlinkButton en Silverlight?

Respuesta

15

Si sólo necesita un subrayado estática (sin efectos mouseover) que sólo debe utilizar un TextBlock como el contenido de la HyperlinkButton. Como HyperlinkButton es un ContentControl, puede tomar cualquier otro tipo de control como contenido (más que solo cadenas simples).

Aquí es un poco de XAML que te llevará un TextBlock subrayado como el contenido de un HyperlinkButton:

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

usted debería ser capaz de crear su TextBlock y establezca la propiedad Contenido de su HyperlinkButton con C# en código- detrás también si eso es lo que estás haciendo.

Como dijo David, la edición de ControlTemplate sin duda funcionará para darle un estilo a un HyperlinkButton a su gusto, pero utilizando un TextBlock realzado subrayado ya que el contenido puede ser más simple y mucho menos XAML si eso es todo lo que necesita hacer.

+0

Sí, también funciona en el código. De hecho, puse el TextBlock dentro de un borde para poder cambiar el color de fondo al pasar el mouse también. Esta solución le permite tener un control total del formato del hipervínculo (excepto el cuadro de enfoque azul). Gracias. –

+0

Para eliminar Blue Box en evento de carga: Rectángulo rect = linkButton.ChildrenOfType () .Where (i => i.Name.Equals ("FocusVisualElement")). FirstOrDefault(); if (rect! = Null) rect.StrokeThickness = 0; – MSNetDev

5

Edite la plantilla de control. Arranqué esto a través de 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> 

cambiar la visibilidad de este control:

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

Esto es tan decepcionante en XAML para WPF/Silverlight/WP/WinRT que para tales cambios de interfaz de usuario básicos, usted (puede) tener que anular toda la plantilla de control. – Sevenate

Cuestiones relacionadas