基于Canvas的WPF自定义控件,启动代码放在哪里?

WPF Custom control based on Canvas, where can I place the initiation code?

我刚刚在 VS - 自定义控件中创建了一个新项目。该控件是基于 Canvas 的,因为我需要一些绘图。代码大部分是自动生成的,所以我不会在这里提供所有项目。

我的目标是绑定一些 events/handlers 控件。不幸的是我没有找到任何构造函数。在互联网上搜索后,我找到了一种方法 - 将初始化代码放在 OnApplyTemplate() 覆盖的方法中。对于我来说,避免构造函数或某些 init 方法是一个奇怪的想法,但无论如何......好吧,我知道逻辑不是 MS 特权,没问题。但真正的问题是这个方法从未被调用过。所以我的问题 - 我应该把我的初始化代码放在哪里或者(如果 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;
    }
}
}

Themes/Generic.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;
    }

    ...
}