C# WPF动态向Canvas添加带Run子元素的Label报错如何解决
错误原因
Label是WPF中的内容控件,不是支持多子元素的布局容器,因此不存在Children属性。你在XAML中可以直接把Run写在Label标签内部,是XAML解析器自动做了包装处理,手写后台C#代码时不会触发这个自动转换逻辑。
另外注意WPF的API采用大驼峰命名规则,集合的添加方法是Add(),你写的小写add()也会触发编译错误。
正确实现代码
Run属于流文档内联元素,只能放在支持内联集合的文本宿主(如TextBlock)中,你需要先创建TextBlock承载Run,再赋值给Label的Content属性即可:
// 初始化Label控件,设置对应属性 Label variableLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, Width = 99, Name = "VariableLabel" }; // 绑定MouseMove事件 variableLabel.MouseMove += Variable_MouseMove; // 初始化Run元素,设置文本、红色背景 Run variableRun = new Run { Background = Brushes.Red, Text = "Variable", Name = "Variable" }; // 创建TextBlock作为文本容器,添加Run元素 TextBlock textHost = new TextBlock(); textHost.Inlines.Add(variableRun); // 将承载了Run的TextBlock赋值给Label的内容属性 variableLabel.Content = textHost; // 最终将Label添加到Canvas容器 canvas.Children.Add(variableLabel);
简化方案
如果你不需要Label特有的访问键、关联目标控件的功能,可以直接用TextBlock作为外层控件,不需要额外嵌套,代码更简洁:
TextBlock variableLabel = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, Width = 99, Name = "VariableLabel" }; variableLabel.MouseMove += Variable_MouseMove; Run variableRun = new Run { Background = Brushes.Red, Text = "Variable", Name = "Variable" }; variableLabel.Inlines.Add(variableRun); canvas.Children.Add(variableLabel);
两种方案最终效果完全一致,都只会给文本区域添加红色背景,不会覆盖控件的留白区域。
内容的提问来源于stack exchange,提问作者qinglan ye
相关产品推荐
相关产品推荐

