2011-01-21 4 views
6

Ciao, ho un problema di associare il metodo all'evento click del controllo "LabelLink". Uso il controllo pseudeo LabelLink, penso che tutti conoscano questa soluzione con textBox e collegamento ipertestuale.metodo di binding sull'evento click del controllo "LabelLink" in WPF - Caliburn

Ecco il mio codice:

<TextBlock Margin="10,12,10,4"> 
    <Hyperlink Name="RegLink" 
       NavigateUri="http://registracia.azet.sk/" 
       Micro:Message.Attach="[Event Click]=[Action OpenDefaultBrowser(NavigateUri)]" 
       FontSize="12">Registrácia</Hyperlink> 

problema è che posso legare metodo solo sull'elemento quadro.

ottengo questo errore di compilazione:

Cannot attach type "ActionMessage" to type "Hyperlink". Instances of type "ActionMessage" can only be attached to objects of type "FrameworkElement". 

che cerco con Google, gemma non ha trovato alcuna soluzione adeguata.

Grazie per il consiglio.

Provo a creare un link falso Etichetta con controllo TextBlock o Label ma non hanno un gestore eventi click.

risposta

5

È possibile incorporare il tuo Hyperlink in un Button che non sembra un pulsante al fine di ottenere un evento Click che si verifica su un FrameworkElement:

<Grid> 
    <Grid.Resources> 
     <Style x:Key="HyperlinkButton" TargetType="Button"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <ContentPresenter/> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Grid.Resources> 
    <StackPanel> 
     <Button Name="button1" Style="{StaticResource HyperlinkButton}" Click="Button_Click" Focusable="False"> 
      <TextBlock> 
       <Hyperlink NavigateUri="http://www.stackoverflow.com" Focusable="False"> 
        StackOverflow 
       </Hyperlink> 
      </TextBlock> 
     </Button> 
    </StackPanel> 
</Grid> 

Forse è possibile adattare questa tecnica per Caliburn.Micro .

+0

Lo provo, ma ottengo l'eccezione: {"'System.Windows.Documents.Hyperlink' non è Visual o Visual3D."} –

+0

Ho testato l'esempio su WPF3.5 e WPF4 visualizzando la tua eccezione. Tuttavia, ho aggiornato l'esempio per includere un wrapper 'TextBlock' attorno a' Hyperlink' e reso il 'Button' e' Hyperlink' non focalizzabili. Vedi se qualcuno di questi cambiamenti aiuta. –

+0

Ottengo System.Windows.Documents.Hyperlink 'non è un'eccezione Visual o Visual3D con il wrapper TextBlock attorno a Hyperlink in WPF4. Qualche risoluzione a questo fenomeno? – rageit

10

ho adattato @ risposta di Rick per Caliburn.Micro

In TestView.xaml

<Grid> 
    <Grid.Resources> 
     <Style x:Key="HyperlinkButton" TargetType="Button"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <ContentPresenter/> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Grid.Resources> 

    <Button Style="{StaticResource HyperlinkButton}" Focusable="False" 
     cal:Message.Attach="[Action NavigateTo('http://www.stackoverflow.org')]"> 
     <TextBlock> 
      <Hyperlink Focusable="False">www.stackoverflow.com</Hyperlink> 
     </TextBlock> 
    </Button> 
</Grid> 

In TestViewModel.cs

public void NavigateTo(string url) 
    { 
     Process.Start(new ProcessStartInfo(url)); 
    } 

sto usando in questo modo nella mia applicazione e lavori. Spero che ti aiuti.

+0

Una vecchia domanda, ma ancora rilevante: il problema con questo approccio è che causa problemi con il text wrapping: un collegamento ipertestuale può iniziare alla fine di una riga e continuare all'inizio del successivo - i pulsanti non possono farlo . – ReflexiveCode

1

Ho fatto questo in vs2017

Metodo In ViewModel

 public void LinkClick(string url) 
    { 

     if (!string.IsNullOrEmpty(url)) 
     { 
      System.Diagnostics.Process.Start(new ProcessStartInfo(url)); 
     } 
    } 

Poi, come sopra nella dichiarazione dello spazio dei nomi XAML Guarda le prime

xmlns: cal = "http: // www. caliburnproject.org"

  <Grid> 
       <Grid.Resources> 
        <Style x:Key="HyperlinkButton" TargetType="Button"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="Button"> 
            <ContentPresenter/> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </Grid.Resources> 
       <!-- Collapsed so you can not see it ! --> 
       <TextBlock x:Name="LinkTarget" Text="http://www.google.com" Visibility="Collapsed"/> 
       <!-- Bound the TAG to the Collapsed TextBlock Text then pass that into the method in VM --> 
       <Button Tag="{Binding ElementName=LinkTarget, Path=Text}" Style="{StaticResource HyperlinkButton}" Focusable="False" 
         cal:Message.Attach="[LinkClick($this.Tag)]"> 
        <TextBlock> 
         <Hyperlink Focusable="False">Read More ...</Hyperlink> 
        </TextBlock> 
       </Button> 
      </Grid> 

Spero che questo aiuti qualcun altro! So che è un vecchio post ma, sono atterrato qui!