2012-11-07 30 views
1

我對WPF很新,我試圖編寫基本上是TextBlock的自定義控件,但也有一個單擊事件。我試圖從各種來源拼湊這件事,但它不起作用。不調用自定義控件的OnMouseLeftButtonDown

在下面的代碼中,我期望OnMouseLeftButtonDown在元素上執行鼠標單擊時被調用。如果發生這種情況,我想提高Click事件。查看調試器,該函數從不被調用。

我誤解了這是應該如何工作,或做了一些其他錯誤發現它的方式進入我的代碼?

namespace EP3_gui.Controls 
{ 
    public class ClickableTextBlock : TextBlock 
    { 
     public ClickableTextBlock() : base() 
     { } 

     public ClickableTextBlock(Inline inline) 
      : base(inline) 
     { } 

     protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
     { 
      base.OnMouseLeftButtonDown(e); 
      RoutedEventArgs args = new RoutedEventArgs(ClickEvent); 
      RaiseEvent(args); 
     } 

     public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent(
      "Click", 
      RoutingStrategy.Bubble, 
      typeof(RoutedEventHandler), 
      typeof(ClickableTextBlock) 
     ); 

     public event RoutedEventHandler Click 
     { 
      add { AddHandler(ClickEvent, value); } 
      remove { RemoveHandler(ClickEvent, value); } 
     } 
    } 
} 
+1

這對我很好。在一個新的乾淨的WPF項目中嘗試你的代碼,你會看到它自己。在DEBUG模式下,我的'OnMouseLeftButtonDown'中的斷點已經到達,我的MainWindow代碼隱藏中的已註冊的ClickHandler也已到達。 – menty

+0

謝謝,我有我的用戶控件不起作用。我會盡力狩獵現在...我應該刪除這個問題嗎? –

+0

@AndreasWallner不需要刪除它,但也許你可以根據你找到的解決方案自己發佈一個簡短的答案? – McGarnagle

回答

0

正如@menty指出的那樣,代碼中沒有錯誤,我在測試Control時犯了一個錯誤。在XAML來測試它,我進入了一個值,因爲否則的控制不會有任何的高度和寬度(使用自動的大小)

我的代碼是

<cc:ClickableTextBlock x:Name="bit3" ... Click="bitText_Click" Text="{Binding Value}">0<cc:ClickableTextBlock> 

如果一個人改變,要

<cc:ClickableTextBlock x:Name="bit3" ... Click="bitText_Click" Text="{Binding Value}" /> 

它可以工作,但是之後無法在設計器中看到該元素。在我的情況下,它是非常糟糕的,因爲父級用戶控件的大小設置爲auto,所以整個控件在設計器上看起來是錯誤的。

的解決方案是爲綁定提供一個默認值:

<cc:ClickableTextBlock x:Name="bit3" ... Click="bitText_Click" Text="{Binding Value, FallbackValue=0}" /> 

這樣,它的工作原理和控制是可見的設計師。