【问题标题】:approach for custom WPF edit-text-in-place control自定义 WPF 就地编辑文本控件的方法
【发布时间】: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


    【解决方案1】:

    为什么你需要 TextBlock 和 TextBox 这两者?根据您的说法,仅 TextBox 就足够了。您将应用具有一些触发器的样式,这些触发器会根据IsKeyboardFocused 改变外观。

    【讨论】:

    • 虽然我仍然需要连接所有绑定,但您的方法会将它们减少一半。但是,如果我只处理一个 TextBox,我可能会从 TextBox 继承(而不是从 Control 继承),然后我会免费获得所有 TextBox 绑定。谢谢!
    • @Mike 从 TextBox 继承实际上是我的意思。想知道为什么我实际上没有写它...
    • @Mike,仅供将来参考:关于您认为必须设置的所有绑定:其中许多没有太大意义。您不想设置自定义控件的宽度并在内部绑定到宽度。您将根据外部设置的约束调整内部控件的大小-因此根本没有绑定。这适用于任何布局属性。实际上,您必须绑定一些字体内容或HorizontalContentAlignment
    • 您对绑定的数量是正确的。我不打算连接 所有 绑定 - 只是按照你的建议我需要的绑定,但它仍然看起来有点多,感觉不是正确的方法。
    【解决方案2】:

    在 XAML 中创建一个 UserControl 可能更容易,其中定义了 TextBox 和 TextBlock 并将其绑定到自定义 DependencyObject 或您放在 UserControl 代码后面的依赖项属性。两个控件都可以绑定到相同的属性。在查看模式下将 TextBox 可见性设置为折叠,在编辑模式下将其设置为可见。最初进入编辑模式时,请确保将鼠标光标聚焦在 TextBox 中。如果需要,我可以提供更多详细信息,但目前我是通过智能手机输入的。

    【讨论】:

      【解决方案3】:

      我通过在文本块上按需打开一个弹出窗口以不同的方式解决了这个问题。文本编辑弹出窗口显示一个文本框,该文本框复制所有文本块外观而无需绑定。在弹出窗口关闭并更新文本块文本时,更改将被丢弃。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多