2011-01-21 40 views
6

Xin chào Tôi có vấn đề để ràng buộc phương pháp về sự kiện nhấp chuột của "LabelLink" kiểm soát. Tôi sử dụng kiểm soát Labelse pseudeo, tôi nghĩ mọi người đều biết giải pháp này với textBox và siêu liên kết.phương pháp liên kết trên sự kiện nhấp chuột của điều khiển "LabelLink" trong WPF - Caliburn

Đây là mã của tôi:

<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> 

Vấn đề là tôi có thể ràng buộc phương pháp duy nhất trên yếu tố khuôn khổ.

tôi nhận được lỗi biên dịch này:

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

tôi tìm kiếm với google, nụ đã không tìm thấy bất kỳ giải pháp phù hợp.

Cảm ơn lời khuyên.

Tôi thử tạo liên kết giảLabel giả bằng textBlock hoặc Kiểm soát nhãn nhưng không có trình xử lý sự kiện nhấp chuột.

Trả lời

5

Bạn có thể nhúng của bạn Hyperlink trong một Button rằng không giống như một nút để có được một sự kiện Click xảy ra trên một 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> 

lẽ bạn có thể thích nghi với kỹ thuật này để Caliburn.Micro .

+0

Tôi thử, Nhưng hãy ngoại lệ: {"'System.Windows.Documents.Hyperlink' không phải là Visual hay Visual3D."} –

+0

Tôi đã thử nghiệm ví dụ trên WPF3.5 và WPF4 khi thấy ngoại lệ của bạn. Tuy nhiên, tôi đã cập nhật ví dụ để bao gồm một trình bao bọc 'TextBlock' xung quanh' Siêu liên kết' và làm cho 'Nút' và' Siêu liên kết' không thể tập trung được. Xem liệu có bất kỳ thay đổi nào trong số những thay đổi đó giúp ích hay không –

+0

Tôi nhận được System.Windows.Documents.Hyperlink 'không phải là một ngoại lệ Visual hay Visual3D quá với TextBlock wrapper xung quanh Hyperlink trong WPF4. Bất kỳ giải quyết cho hiện tượng này? – rageit

10

Tôi đã thích nghi @ câu trả lời Rick để Caliburn.Micro

Trong 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> 

Trong TestViewModel.cs

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

Tôi đang sử dụng cách này trong ứng dụng của tôi và nó công trinh. Hy vọng nó sẽ giúp bạn.

+0

Một câu hỏi cũ, nhưng vẫn có liên quan: Vấn đề với cách tiếp cận này là nó gây ra vấn đề với gói văn bản: siêu liên kết có thể bắt đầu ở cuối một dòng và tiếp tục ở đầu các nút tiếp theo không thể làm điều đó . – ReflexiveCode

1

I Did này trong vs2017

Phương pháp Trong ViewModel

 public void LinkClick(string url) 
    { 

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

Sau đó, như trên trong tờ khai namespace Xem XAML tại

xmlns top: 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> 

Hy vọng điều này sẽ giúp ích cho người khác! Tôi biết nó là một bài cũ nhưng, tôi đã hạ cánh ở đây!

Các vấn đề liên quan