Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Open WPF form when clicking WPF hyperlink

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.

like image 618
rogcg Avatar asked Apr 18 '11 18:04

rogcg


4 Answers

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();
}
like image 71
Alex Mendez Avatar answered Nov 01 '22 11:11

Alex Mendez


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();
        }
    }
}
like image 37
H.B. Avatar answered Nov 01 '22 10:11

H.B.


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
}
like image 3
juergen d Avatar answered Nov 01 '22 11:11

juergen d


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?

like image 2
Miranda Avatar answered Nov 01 '22 10:11

Miranda