C# 从Silverlight XAML调用基类方法
作为学习Silverlight的一部分,我尝试创建一个基本UserControl,作为继承控件的起点。 非常简单,它只定义了一些回调方法: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
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" />