基于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;
}
...
}
我刚刚在 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;
}
...
}