【问题标题】:Open WPF form when clicking WPF hyperlink单击 WPF 超链接时打开 WPF 表单
【发布时间】:2011-08-08 02:41:26
【问题描述】:

当我单击 WPF 超链接时,我想打开一个新的 WPF 表单。我看过很多只打开web url的例子,但我想打开一个新的WPF表单。

【问题讨论】:

    标签: c# .net wpf xaml hyperlink


    【解决方案1】:

    你可以这样实现:

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

    【讨论】:

      【解决方案2】:

      你可以只处理点击事件:

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

      【讨论】:

        【解决方案3】:

        而使用 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
        }
        

        【讨论】:

          【解决方案4】:

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

          这个?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-07-01
            • 2018-09-17
            • 1970-01-01
            • 2013-12-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多