2012-06-19 28 views
3

有一個我不明白的有趣情況。無法分配到屬性'System.Windows.Controls.Primitives.ButtonBase.Click'

這裏是場景:

我創建了一個簡單的Silverlight 5應用程序。我在主頁面上放置一個按鈕控件並創建一個Click事件處理程序。

XAML如下所示.....

<UserControl x:Class="SilverlightApplication6.MainPage" 
    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" d:DesignWidth="400"> 

    <Grid x:Name="LayoutRoot" Background="White"> 
     <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="130,43,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
    </Grid> 
</UserControl> 

到目前爲止好。

電線起來身後,這樣的代碼的事件處理程序....

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    MessageBox.Show("Hi There!!!"); 
} 

編譯並運行應用程序。我'點擊'按鈕,並獲得一個不錯的小消息框。再次,到目前爲止,這麼好。

向後面的代碼添加一個新的方法,使用與按鈕單擊事件處理程序相同的方法名稱,但使用不同的簽名。

private void button1_Click() 
{ 
    MessageBox.Show("This method causes a XamlParseException!"); 
} 

編譯並執行代碼。調出應用程序並點擊按鈕,我會得到以下例外:

System.Windows.Markup.XamlParseException was unhandled by user code 
    Message=Failed to assign to property 'System.Windows.Controls.Primitives.ButtonBase.Click'. [Line: 10 Position: 149] 
    LineNumber=10 
    LinePosition=149 
    StackTrace: 
     at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) 
     at SilverlightApplication6.MainPage.InitializeComponent() 
     at SilverlightApplication6.MainPage..ctor() 
     at SilverlightApplication6.App.Application_Startup(Object sender, StartupEventArgs e) 
     at MS.Internal.CoreInvokeHandler.InvokeEventHandler(UInt32 typeIndex, Delegate handlerDelegate, Object sender, Object args) 
     at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName, UInt32 flags) 
    InnerException: 

爲什麼會發生這種情況?

回答

2

問題是void button1_Click()不是Click事件的有效處理程序。 ClickRoutedEventHandler,其定義爲:

public delegate void RoutedEventHandler(
    Object sender, 
    RoutedEventArgs e 
) 

請注意,您還可以使用void button1_Click(object anyName, EventArgs forTheParams),它只是相匹配的代表密切足夠的轉換。

+1

正確,它不是一個有效的處理程序 - 但我不想這樣使用它。僅僅出現這段代碼就會產生異常。 – doon386

+0

嗯......顯而易見的解決方法是重命名其中一個方法。另一種可能的選擇是添加參數默認值null('object sender = null,EventArgs e = null'),這樣您的代碼仍然可以調用'button1_Click()',並且它只有null發送者和e個參數。如果這些不起作用,那麼解釋這兩種重載之間的關係會很好。 –

+1

我不需要解決。按照您的建議,這很簡單,只需重新命名該方法即可。我很好奇的是,鑑於C#/ .NET/CLR的多態特性,爲什麼在運行時無法解析/確定正確的方法? – doon386

0

我,我掛一個按鈕,這樣的方法的情況下...

<Button Click="MethodName"..../> 

我莫名其妙地複製的方法不知道,因此我也得到了這個錯誤。 未能分配給屬性'System.Windows.Controls.Primitives.ButtonBase.Click 希望這可以幫助某人節省一些時間。

相關問題