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

问题描述 投票:0回答:1

我刚刚在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 
)]
c# wpf wpf-controls custom-controls
1个回答
2
投票

只要添加一个构造函数,像这样。

public class MyMap : Canvas
{
    public MyMap()
    {
        SizeChanged += Map_SizeChanged;
    }

    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.