【发布时间】:2011-08-08 02:41:26
【问题描述】:
当我单击 WPF 超链接时,我想打开一个新的 WPF 表单。我看过很多只打开web url的例子,但我想打开一个新的WPF表单。
【问题讨论】:
标签: c# .net wpf xaml hyperlink
当我单击 WPF 超链接时,我想打开一个新的 WPF 表单。我看过很多只打开web url的例子,但我想打开一个新的WPF表单。
【问题讨论】:
标签: c# .net wpf xaml hyperlink
你可以这样实现:
<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();
}
【讨论】:
你可以只处理点击事件:
<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();
}
}
}
【讨论】:
而使用 MVVM,您可以在视图中进行操作
<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
}
【讨论】:
XAML:
<TextBlock Height="23" HorizontalAlignment="Left" Margin="254,130,0,0" Name="textBlock1" VerticalAlignment="Top">
<Hyperlink Click="Hyperlink_Click">Clique Aqui</Hyperlink>
</TextBlock>
代码隐藏:
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
MainWindow m = new MainWindow();
m.Show();
}
这个?
【讨论】: