WPF: LinkButton vs Hyperlink, using the right code!!!

Hace poco publicaba un post sobre cómo crear un control LinkButton modificando el estilo y la plantilla de un control botón de WPF para añadirle la funcionaldad requerida, que estaba basado en otro post.
Pues bien, replicar contenido, aún manteniendo el origen del mismo, no creo que sea una buena línea a seguir, a pesar de que parezca un buen ejemplo de cómo modificar la funcionalidad de los controles de WPF, rectifico.


El contenido del post original no es del todo correcto, por lo que, después de pediros mil disculpas a todos por mi error, paso a exponer:


El control LinkButton como tal no existe en WPF, pero si su sinónimo, es decir, el control Hyperlink, que aporta la misma funcionalidad.
Para usarlo, debemos contener dicho control en un TextBlock en cualquier punto de nuestra interfaz o dentro de un párrafo de texto ya que se trata de un «inline-level flow content element», es decir, un elemento pensado para usar en flujos de líneas de texto.


Un ejemplo de esto sería:


<TextBlock>
  <Hyperlink NavigateUri=http://geeks.ms>Geeks·ms</Hyperlink>
</TextBlock>


Como vemos, es mucho más sencillo y evitamos tener que suscribirnos a un evento y crear código para responder al mismo.


Espero que os sea de utilidad.

WPF: Crear un control Linkbutton

Windows Presentation Foundation nos aporta la funcionalidad base para desde ella poder crear controles con estructuras y comportamientos más complejos.


Nos encontramos en ocasiones con que controles que eran para nosotros muy comunes en WinForms ya no está disponibles en WPF, pero sin embargo el tiempo y la complejidad que requiere implementarlos es minúsculo.


Vease por ejemplo el control LinkButton, que no está disponible en WPF y una posible implementación de este basado en un post de Irena Kennedv (Microsoft Consultant Services):


Dentro de nuestra ventana crearíamos un nuevo estilo dentro de los recursos del Grid (o de la ventana, aplicación…) y se lo aplicaríamos a un control Button de WPF mediante el atributo Style=«{StaticResource LinkButtonStyle}».
El estilo que estamos aplicando modifica la plantilla del control y le aporta el comportamiento deseado.







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<Window x:Class=«linkdemo.Window1»
xmlns=«http://schemas.microsoft.com/winfx/2006/xaml/presentation»
xmlns:x=«http://schemas.microsoft.com/winfx/2006/xaml»
Title=«linkdemo» Height=«300» Width=«300»
>
<Grid>

<Grid.Resources>
<Style x:Key=«LinkButtonStyle» TargetType=«{x:Type Button}»>
<Setter Property=«SnapsToDevicePixels» Value=«true» />
<Setter Property=«OverridesDefaultStyle» Value=«true» />
<Setter Property=«Template»>
<Setter.Value>
<ControlTemplate TargetType=«{x:Type Button}»>
<TextBlock x:Name=«tb» Background=«{x:Null}»
                  Cursor=«Hand» TextDecorations=«Underline» 
                  TextWrapping=«Wrap» >
<ContentPresenter VerticalAlignment=«Center»
                  RecognizesAccessKey=«true»/>
</TextBlock>
<ControlTemplate.Triggers>
<Trigger Property=«IsPressed» Value=«true» >
<Setter Property=«Cursor» Value=«Hand» />
<Setter TargetName=«tb» Property=«BitmapEffect»>
<Setter.Value>
<DropShadowBitmapEffect ShadowDepth=«1»
                        Direction=«330» Color=«Black» Opacity=«0.5» 
                        Softness=«0.25» />
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>

<Button x:Name=«LinkButton1» Click=«LinkButton1_Click»
      Style=«{StaticResource LinkButtonStyle}»
Foreground=«Blue» Height =«18» Width=«120px» >
Escribe el texto aquí…
</Button>


</Grid>
</Window>


Y además creamos nuestro manejador del evento Click mediante un delegado en nuestro código lateral para darle funcionalidad:







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace linkdemo
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>

public partial class Window1 : System.Windows.Window
{

public Window1()
{
InitializeComponent();
}

void LinkButton1_Click(object sender, RoutedEventArgs e)
{
//Escribe tu código aquí…
}

}
}