I want to open a new WPF form when I click in a WPF hyperlink. I've seen a lot of examples that only opens web url, but I want to open a new WPF form.
You can achive this like this:
<Label Height="25" Margin="26,27,116,0" Name="label1" VerticalAlignment="Top">
<Hyperlink Click="Hyperlink_Click">Click Me</Hyperlink>
</Label>
and handle it like this:
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
Window2 form2 = new Window2();
form2.Show();
}
You could just handle the click event:
<Hyperlink Click="Hyperlink_Click">Link</Hyperlink>
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
Dialogue diag = new Dialogue();
diag.Show();
}
You could also go crazy with XAML:
<Hyperlink>
<Hyperlink.Style>
<Style TargetType="{x:Type Hyperlink}">
<Style.Triggers>
<EventTrigger RoutedEvent="Hyperlink.Click">
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility">
<Storyboard.Target>
<local:Dialogue />
</Storyboard.Target>
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</Hyperlink.Style>
<Hyperlink.Inlines>
<Run Text="Open Dialogue"/>
</Hyperlink.Inlines>
</Hyperlink>
This however is very problematic since once the dialogue is closed it cannot be reopened, that means when you click the hypelink again an exception will be thrown.
Using interactivity you could do this without such problems (needs a reference to the Blend SDK though):
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
<Hyperlink>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<t:CreateDialogAction Type="{x:Type local:Dialogue}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<Hyperlink.Inlines>
<Run Text="Open Dialogue"/>
</Hyperlink.Inlines>
</Hyperlink>
The action for this:
public class CreateDialogAction : TriggerAction<Hyperlink>
{
public Type Type { get; set; }
protected override void Invoke(object parameter)
{
if (Type != null && Type.IsSubclassOf(typeof(Window)) && Type.GetConstructor(Type.EmptyTypes) != null)
{
Window window = Type.GetConstructor(Type.EmptyTypes).Invoke(null) as Window;
window.Show();
}
}
}
And using MVVM you can do in your View
<Hyperlink NavigateUri="{Binding MyUri}"
Command="{Binding OpenHyperlinkCommand}">Link text
</Hyperlink>
and in your ViewModel
private ICommand _openHyperlinkCommand;
public ICommand OpenHyperlinkCommand {
get
{
if (_openHyperlinkCommand == null)
_openHyperlinkCommand = new RelayCommand<object>(p => ExecuteHyperlink());
return _openHyperlinkCommand;
}
}
private void ExecuteHyperlink() {
//do stuff here
}
XAML :
<TextBlock Height="23" HorizontalAlignment="Left" Margin="254,130,0,0" Name="textBlock1" VerticalAlignment="Top">
<Hyperlink Click="Hyperlink_Click">Clique Aqui</Hyperlink>
</TextBlock>
CodeBehind :
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
MainWindow m = new MainWindow();
m.Show();
}
this?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With