我刚刚在VS中创建了一个新项目--自定义控件。这个控件是基于Canvas的,因为我需要一些绘图。代码大部分是自动生成的,所以我不会在这里提供所有的项目。
我的目标是绑定控件的一些事件处理程序。不幸的是,我没有找到任何构造函数。在互联网上搜索了一下,我找到了一个方法--把init代码放在控件的 OnApplyTemplate()
覆盖方法。 对我来说,避免使用构造函数或一些init方法是个奇怪的想法,但无论如何......我知道逻辑不是MS的特权,没问题。好吧,我知道逻辑不是MS的特权,没问题。但真正的问题是,这个方法从来没有被调用过。所以我的问题是--我应该把我的init代码放在哪里,或者(如果OnApplyTemplate是唯一的选择)如何让这个方法在组件启动时被调用?
MyMap.cs
namespace MyControl
{
public class MyMap : Canvas
{
public static readonly DependencyProperty ZoomProperty = DependencyProperty.Register("Zoom",
typeof(float),
typeof(MyMap),
new PropertyMetadata(0.5f));
public float Zoom
{
get { return (float)GetValue(ZoomProperty); }
set { SetValue(ZoomProperty, value); }
}
static MyMap()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyMap), new FrameworkPropertyMetadata(typeof(MyMap)));
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
this.SizeChanged += Map_SizeChanged;
}
}
}
ThemesGeneric.xaml文件内容。
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyControl">
</ResourceDictionary>
AssemblyInfo.cs有以下几行。
[assembly: ThemeInfo(
ResourceDictionaryLocation.None,
ResourceDictionaryLocation.SourceAssembly
)]
只要添加一个构造函数,像这样。
public class MyMap : Canvas
{
public MyMap()
{
SizeChanged += Map_SizeChanged;
}
...
}