2013-05-13 105 views
1

我有一個帶按鈕集合的XAML用戶控件。XAML按鈕單擊或點擊事件不會在用戶控件中引發

我的XAML如下:

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
d:DesignHeight="300" Width="85" 
> 

<Grid Background="#7F010305" HorizontalAlignment="Left"> 
    <Grid.RowDefinitions>    
     <RowDefinition Height="*" /> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" />    
    </Grid.ColumnDefinitions> 

    <Button x:Name="Zoom" Grid.Row="0" Grid.Column="0" Width="40" Height="40" Margin="15,0,15,15" Click="OnClicked" Tapped="OnClicked" /> 
    <Button x:Name="Pan" Grid.Row="1" Grid.Column="0" Width="40" Height="40" Margin="15,0,15,15" Click="OnClicked" Tapped="OnClicked" /> 
    <Button x:Name="Contrast" Grid.Row="2" Grid.Column="0" Width="40" Height="40" Margin="15,0,15,15" Click="OnClicked" Tapped="OnClicked"/> 
    <Button x:Name="Brightness" Grid.Row="3" Grid.Column="0" Width="40" Height="40" Margin="15,0,15,15" Click="OnClicked" Tapped="OnClicked"/> 

</Grid> 

不知何故,點擊或敲打事件是沒有得到提高。我嘗試了各種選擇,但Click或Tapped事件沒有被解僱。

任何提示?

+0

usercontrol使用故事板動畫顯示。最初它的可見性被設定爲崩潰。 – Venki 2013-05-13 12:33:41

+0

你是否在UserControl代碼隱藏中聲明瞭OnClicked事件? – letiagoalves 2013-05-13 12:36:31

+0

是的。 onclicked事件在後面的usercontrol代碼中。 – Venki 2013-05-13 12:39:53

回答

1

從查看您的代碼我注意到,您有Click和Tapped事件處理程序都指向相同的方法(「OnClicked」)。但是,這些事件對代表有不同的簽名。 Click事件願與簽名的方法(http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.primitives.buttonbase.click.aspx):

void ClickDelegate(object sender, RoutedEventArgs e) 

而螺紋事件願與簽名的方法(http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.input.tappedeventhandler.aspx):

void TappedDelegate(object sender, TappedRoutedEventArgs e) 

所以這兩種方法的簽名是不等價看起來不太可能對兩個事件都使用相同的方法,因爲它們需要不同的委託簽名(後臺運行的代碼將xaml中的邏輯合併到您的代碼中,應該查找一個方法void OnClick (object,RoutedEventArgs)爲您的Click處理程序和一個方法void On點擊(對象,TappedRoutedEventArgs)您的Tapped處理程序)。此外,如果運行時沒有找到匹配的處理程序方法(至少對於8.1中的wirnt),我已經通過測試發現事件處理程序掛接將默默地失敗,而不是拋出異常(我非常確定,對於WPF,這會導致錯誤,這使它稍微混淆)。

長篇故事沒有能夠看到你的代碼背後我最好的猜測是OnClick沒有一個簽名匹配Clicked或Tapped事件的委託類型。除此之外,我還想知道爲什麼你會陷入Tapped和Clicked。 Tapped是廣義事件,基本上與Clicked做同樣的事情,然後一些事件(參見Are Click, Tapped, and PointerPressed synonymous in WinRT-XAML?)。我不能肯定地說,是否連接到他們兩個可能會導致一些奇怪的問題(例如Clicked和Tapped被稱爲一次按),但似乎你可能只想訂閱Tapped事件。

編輯:

只是添加另一點。有時候我曾經發生過,即使你做的一切都是正確的(在這裏等於你已經精心地加倍檢查了所有事情,並且儘可能地說是正確的),事件處理程序仍然不起作用。說實話,我只見過這種情況發生時,組件的複雜組合比你所擁有的要複雜得多(比如那些涉及幾乎所有自定義類型的東西,你可以想象...自定義面板,數據模板選擇器,itemtemplateselectors等)和上午不知道我是否經常不時地忽略某些東西,或者微軟代碼中是否存在合法的錯誤。

無論如何,解決方法總是避免以'正常'的方式(比如你在這裏做什麼)把它掛在事件處理程序上。爲此,給按鈕一個名稱並在後面的代碼中添加處理程序(如果按鈕不在模板中,則直接使用該名稱,或者使用OnApplyTemplate中的GetTemplateChild以獲取模板中的按鈕)。然後,您可以對名爲'foo'的按鈕執行類似操作:

foo.Tapped += (sender, args) => { /*do something here */ };