我正在为UWP制作一个自定义TextBox来简化Win2D概述文本解决方案,为此我创建了一个UserControl,其中只包含一个画布,我将在其上绘制文本。
当然我需要一些属性,比如文字,轮廓粗细和颜色等等...... 我还需要一些已经由继承的UserControl公开的属性,如Foreground,FontSize,FontFamily ...... 到目前为止一切顺利,似乎我不需要实现这些常见属性中的每一个。
问题在于,当其中一个属性发生更改时,我找不到挂钩事件的方法,因为我必须调用Canvas.Invalidate()
方法在格式更改时重绘它。
看起来我必须隐藏所有这些属性并创建新的依赖属性来调用Canvas.Invalidate()
。
没有办法更快地完成它?
答案 0 :(得分:0)
没关系,答案就在幕后。
在构造函数中,您可以调用
RegisterPropertyChangedCallback(DependencyProperty dp, DependencyPropertyChangedCallback callback);
例如:
public OutlinedText()
{
InitializeComponent();
RegisterPropertyChangedCallback(FontFamilyProperty, OnPropertyChanged);
RegisterPropertyChangedCallback(FontSizeProperty, OnPropertyChanged);
}
private void OnPropertyChanged(DependencyObject sender, DependencyProperty dp)
{
OutlinedText instance = sender as OutlinedText;
if (instance != null)
{
//Caching the value into CanvasTextFormat for faster drawn execution
if (dp == FontFamilyProperty)
instance.TextFormat.FontFamily = instance.FontFamily.Source;
else if (dp == FontSizeProperty)
instance.TextFormat.FontSize = (Single)instance.FontSize;
instance.needsResourceRecreation = true;
instance.canvas.Invalidate();
}
}