【发布时间】:2011-07-09 06:40:29
【问题描述】:
我正在开发一项功能,该功能允许用户单击空白区域(例如画布)并在他们单击的位置添加一段文本。点击后,他们可以立即编辑文本、更改前景、字体大小等。有点像在 PowerPoint 幻灯片中添加一段文本。
我想知道这种控制的最佳方法是什么。我最初的想法是一个自定义控件(从 Control 继承),它有两个内部 TemplatePart:一个 TextBlock 和一个 TextBox。我将有两种视觉状态:查看和编辑。我将在名为 Text 的自定义控件上拥有一个字符串依赖属性,这两个模板部分将绑定到它们自己的 Text 属性上。当用户单击控件时,它进入编辑模式,TextBlock 被折叠并且 TextBox 可见。当 TextBox 失去焦点时,控件进入查看模式并且 TextBlock 变得可见。当用户在编辑模式下编辑文本时,Text 属性会更新,所有绑定都会反映新的 Text 值。
我对这种方法的担忧是我将不得不包装的可绑定属性的数量。例如,Control 具有 Foreground、FontSize 和 FontFamily 属性。我希望将这些属性带到我的两个模板部件控件中,因为它们应该始终反映用户想要看到的内容——在查看和编辑模式下。例如,在自定义控件上设置 Foreground=Red 意味着内部的 TextBox 和 TextBlock 也应该有一个红色的前景。因此,我必须在 OnApplyTemplate 中为两个模板部分的每个属性连接绑定:
public override void OnApplyTemplate(){
// ... stuff ...
var foregroundBinding = new Binding
{
Source = this,
Path = new PropertyPath("Foreground")
};
myTextBox.SetBinding(TextBox.ForegroundProperty, foregroundBinding);
myTextBlock.SetBinding(TextBlock.ForegroundProperty, foregroundBinding);
// repeat for every other property, such as font size,
// font family, width, maxwidth, height, maxheight,
// horizontal alignment, yadda yadda yadda...
}
鉴于可能有几十个属性我想从我的自定义控件转移到这些内部模板部分,这似乎是一种难以维护的乏味方法 - 特别是如果我更改模板部分的策略稍后。
有没有更好的方法,还是我在正确的轨道上?
【问题讨论】:
标签: wpf wpf-controls binding