有一個我不明白的有趣情況。無法分配到屬性'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:
爲什麼會發生這種情況?
正確,它不是一個有效的處理程序 - 但我不想這樣使用它。僅僅出現這段代碼就會產生異常。 – doon386
嗯......顯而易見的解決方法是重命名其中一個方法。另一種可能的選擇是添加參數默認值null('object sender = null,EventArgs e = null'),這樣您的代碼仍然可以調用'button1_Click()',並且它只有null發送者和e個參數。如果這些不起作用,那麼解釋這兩種重載之間的關係會很好。 –
我不需要解決。按照您的建議,這很簡單,只需重新命名該方法即可。我很好奇的是,鑑於C#/ .NET/CLR的多態特性,爲什麼在運行時無法解析/確定正確的方法? – doon386