WPF如何在Ellipse(椭圆)中嵌套可绑定ViewModel属性的TextBox
问题根因
你现有代码的核心问题是错误复用了Label这类内容控件的模板逻辑:
- TextBox是文本输入控件,重写控件模板时必须提供名为
PART_ContentHost的内容宿主(通常用ScrollViewer)用来承载输入的文本、处理光标逻辑,你用的ContentPresenter不支持TextBox的输入交互 - 双向绑定不需要放到模板内部,直接绑定顶层TextBox的Text属性即可
正确实现代码
<TextBox Width="30" Height="30" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="{Binding FilterText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> <TextBox.Template> <ControlTemplate TargetType="TextBox"> <Grid> <!-- 背景椭圆 --> <Ellipse Stroke="Black" StrokeThickness="1" Fill="White"/> <!-- 固定命名的文本宿主,TextBox内部逻辑会自动识别该名称的元素作为输入内容载体 --> <ScrollViewer x:Name="PART_ContentHost" Margin="2" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> </ControlTemplate> </TextBox.Template> </TextBox>
关键说明
- 必须给文本宿主元素设置
x:Name="PART_ContentHost",这是WPF TextBox的约定命名,缺少该元素会导致文本无法显示、无法输入 - Ellipse可以根据需求调整Fill属性,默认透明的话输入的文字可能和背景混淆,建议设置为白色
- 如果觉得输入区域太小,可以适当调大TextBox的宽高,或者调整ScrollViewer的Margin值
内容的提问来源于stack exchange,提问作者Melissa
相关产品推荐
相关产品推荐

