Открыть форму WPF при нажатии гиперссылки WPF - PullRequest
12 голосов
/ 18 апреля 2011

Привет, я хочу открыть новую форму WPF, когда нажимаю гиперссылку WPF. Как мне это сделать. Я видел много примеров, которые открывают только веб-URL, но я хочу открыть новую форму WPF.

Ответы [ 4 ]

21 голосов
/ 18 апреля 2011

Вы можете достичь этого следующим образом:

<Label Height="25" Margin="26,27,116,0" Name="label1" VerticalAlignment="Top">
    <Hyperlink Click="Hyperlink_Click">Click Me</Hyperlink>
</Label>

и обработать его следующим образом:

private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
    Window2 form2 = new Window2();
    form2.Show();
}
5 голосов
/ 18 апреля 2011

Вы можете просто обработать событие щелчка:

<Hyperlink Click="Hyperlink_Click">Link</Hyperlink>
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
    Dialogue diag = new Dialogue();
    diag.Show();
}

Вы также можете сойти с ума с 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>

Это, однако, очень проблематично, поскольку однаждыдиалог закрыт, его нельзя открыть, это означает, что при повторном нажатии на гиперссылку будет выдано исключение.


Используя интерактивность, вы можете сделать это без таких проблем (хотя ссылка на Blend SDK возможна)):

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>

Действие для этого:

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();
        }
    }
}
2 голосов
/ 19 февраля 2015

А используя MVVM вы можете сделать это в своем View

<Hyperlink NavigateUri="{Binding MyUri}" 
           Command="{Binding OpenHyperlinkCommand}">Link text
</Hyperlink>

и в вашей 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
}
2 голосов
/ 18 апреля 2011

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();
        }

это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...