我正在开发一项功能,允许用户点击空白区域(例如Canvas)并在他们点击的位置添加一段文字。点击后,他们可以立即编辑文本,更改前景,字体大小等。有点像在PowerPoint幻灯片中添加一段文字。
我想知道这种控制的最佳方法是什么。我最初的想法是一个自定义控件(从Control继承),它有两个内部TemplatePart:一个TextBlock和一个TextBox。我将有两种视觉状态:查看和编辑。我将在名为Text的自定义控件上有一个字符串依赖项属性,这两个模板部件在它们自己的Text属性上绑定。当用户单击该控件时,它将进入编辑模式,TextBlock将折叠并且TextBox可见。当TextBox失去焦点时,控件进入查看模式,TextBlock变为可见。当用户在编辑模式下编辑文本时,Text属性会更新,所有绑定都会反映新的Text值。
我对这种方法的关注是我必须要包装的可绑定属性的数量。例如,Control具有Foreground,FontSize和FontFamily属性。我希望将这些属性传递到我的两个模板部件控件中,因为它们应该始终反映用户想要查看的内容 - 在“查看”和“编辑”模式下。例如,在自定义控件上设置Foreground = Red意味着内部TextBox和TextBlock也应该具有Red前景。因此,我必须在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...
}
鉴于我可能需要将几十个属性从我的自定义控件转移到这些内部模板部件,这似乎是一个难以维护的繁琐方法 - 特别是如果我更改模板部件的策略以后。
有更好的方法,还是我在这里正确的方向?
答案 0 :(得分:1)
在XAML中创建UserControl可能更容易,TextBox和TextBlock已定义并绑定到自定义DependencyObject或您放在UserControl代码后面的依赖项属性。两个控件都可以绑定到相同的属性。在视图模式下将TextBox可见性设置为折叠,并在编辑模式下将其设置为可见。最初进入编辑模式时,请务必将鼠标光标对准TextBox。如果需要,我可以提供更多细节,但目前我正在通过智能手机打字。
答案 1 :(得分:1)
为什么你需要TextBlock和TextBox?根据你的说法,仅TextBox就足够了。您将应用具有某些触发器的样式,这些触发器会根据IsKeyboardFocused更改外观。
答案 2 :(得分:1)
我通过在文本块上完全按需打开弹出窗口来解决这个问题。文本编辑弹出窗口显示一个文本框,该文本框复制所有文本块外观而不进行绑定。在弹出窗口关闭并更新文本块文本时,将丢弃更改。