Avalonia 中没有内置的“可编辑 TextBlock”,因为
TextBlock本意就是只读显示文本。要实现“看起来像 TextBlock、但双击可编辑”的效果,实际做法是:用
TextBlock和
TextBox组合切换显示/编辑状态。
用 TextBox 替代 + 样式模拟 TextBlock 外观
这是最常用、最可控的方式。核心思路是让
TextBox在非聚焦时视觉上“隐身”为 TextBlock —— 去掉边框、背景、光标、选中高亮等,并匹配字体、颜色、对齐等样式。 设置
BorderThickness="0"、
Background="Transparent"、
Foreground="{Binding Foreground, RelativeSource={RelativeSource AncestorType=TextBlock}}"
禁用默认选中高亮:SelectionBrush="Transparent"、
SelectionTextBrush="{Binding Foreground}"
聚焦时才显示光标和轻微背景(可选),失焦后立即提交并切回“静态”外观
用 IsReadOnly="True"切换编辑态(更轻量),或通过
IsEnabled+ 触发器控制
双击进入编辑 + 回车/失焦保存
行为逻辑需手动绑定:监听
TextBlock的
PointerPressed或双击事件,切换到
TextBox并获取焦点;再监听
TextBox的
LostFocus和
KeyDown(Enter)事件来保存并退出编辑。 推荐用命令(
ICommand)封装“开始编辑”和“提交编辑”逻辑,便于 MVVM 解耦 编辑时建议临时设
IsReadOnly="False",提交后立刻设回
True并清空焦点 注意处理 Esc 键取消编辑:在
KeyDown中拦截
Key.Escape,恢复原始值并退出编辑态
用 ContentControl + DataTemplateSelector 动态切换
适合列表项或复用场景。定义两个 DataTemplate:一个用于显示(TextBlock),一个用于编辑(TextBox),由
DataTemplateSelector根据当前是否处于编辑状态返回对应模板。 ViewModel 中维护
IsEditing属性,触发
INotifyPropertyChanged
ContentControl绑定到文本内容,
ContentTemplateSelector绑定到选择器实例 选择器中根据
IsEditing返回不同模板,避免 XAML 中写大量
Visibility切换逻辑
第三方控件或社区方案参考
目前 Avalonia 官方未提供
EditableTextBlock,但社区已有轻量封装: Avalonia.Controls 源码中可参考
TextBox实现,自行派生定制 nuget 上有实验性包如
Avalonia.Xaml.Interactions提供行为扩展,可简化双击绑定 小项目不建议直接引入重型 UI 库,优先用上述组合方式——清晰、可控、无额外依赖
