C# 从Silverlight XAML调用基类方法

C# 从Silverlight XAML调用基类方法,c#,silverlight,xaml,silverlight-4.0,C#,Silverlight,Xaml,Silverlight 4.0,作为学习Silverlight的一部分,我尝试创建一个基本UserControl,作为继承控件的起点。 非常简单,它只定义了一些回调方法: public class ClickableUserControl : UserControl { private Control _superParent; public ClickableUserControl() { } public ClickableUserControl(Control superPa

作为学习Silverlight的一部分,我尝试创建一个基本UserControl,作为继承控件的起点。 非常简单,它只定义了一些回调方法:

public class ClickableUserControl : UserControl
{
    private Control _superParent;

    public ClickableUserControl()
    {

    }

    public ClickableUserControl(Control superParent)
    {
        _superParent = superParent;

        this.MouseEnter += new MouseEventHandler(PostfixedLayoutItem_MouseEnter);
        this.MouseLeave += new MouseEventHandler(PostfixedLayoutItem_MouseLeave);
        this.MouseLeftButtonDown += new MouseButtonEventHandler(PostfixedLayoutItem_MouseLeftButtonDown);
    }

    public virtual void PostfixedLayoutItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var elements = VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), this);
        if (elements.Any(elm => elm is ClickToEditTextBox))
        {
            e.Handled = false;
        }
    }

    public void PostfixedLayoutItem_MouseLeave(object sender, MouseEventArgs e)
    {
        this.Cursor = Cursors.Arrow;
    }

    public void PostfixedLayoutItem_MouseEnter(object sender, MouseEventArgs e)
    {
        this.Cursor = Cursors.Hand;
    }

    public void ClickToEditTextBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter || e.Key == Key.Escape)
        {
            VisualStateManager.GoToState((Control)sender, "NotEdit", false);
            _superParent.Focus();
        }
    }

}
请注意问题所在的ClickToEditTextBox_KeyDown()方法

现在,我继承了一个如下所示的控件(CheckboxLayoutItem.xaml):


(注意-为了便于阅读,我删除了一些名称空间声明) 请注意以下行:

<Self:ClickToEditTextBox KeyDown="ClickToEditTextBox_KeyDown" Text="{Binding Label, Mode=TwoWay,  ElementName=layoutItem}" MaxWidth="150" MinWidth="150" TextWrapping="Wrap" MaxHeight="200" VerticalAlignment="Top" />

在其中,我在ClickToEditTextBox上设置了KeyDown事件(定义了自名称空间,并且正确地定义了自名称空间)

现在,在构造函数中的代码隐藏(CheckboxLayoutItem.xaml.cs)中,对InitializeComponent()的调用失败,错误为:未能分配属性“System.Windows.UIElement.KeyDown”。[第17行位置:42]

但是,我无法调试到InitializeComponent中,但是我看不出这个错误可能导致什么问题,除了XAML中的KeyDown事件

现在,我的问题是——为什么我(看起来)不能引用基类中定义的方法!?以前我在CheckboxLayoutItem.xaml.cs方法本身中有这个方法,但是由于其他一些控件需要一些相同的功能,所以将它放在基类中似乎是一个更好的选择


干杯

我知道这并不能真正回答您的问题,但您可能想看看模板(自定义控件)控件。用户控制实际上并不是解决您在这里试图做的事情的最佳解决方案


UserControls最适合于构建不打算继承的一次性控件的情况

我知道这看起来有点傻,但我很好奇,如果在你的孩子控件的代码隐藏中,你还创建了一个方法
ParentClickToEditTextBox_KeyDown(objectsender,KeyEventArgs e){base.ClickToEditKeyDown(e);}
干杯!我开始怀疑我的方法不对。。。我将仔细阅读模板控件,然后从那里开始。@Fafnr在您将其转换为模板之前,请记住模板在SL4中有一些奇怪的制表符(制表键用于焦点)限制
<Self:ClickToEditTextBox KeyDown="ClickToEditTextBox_KeyDown" Text="{Binding Label, Mode=TwoWay,  ElementName=layoutItem}" MaxWidth="150" MinWidth="150" TextWrapping="Wrap" MaxHeight="200" VerticalAlignment="Top" />