WPF 中的 TextBlock 控件,后台获取不到他的 Name

2017-12-07 15:05:50 +08:00
 BadCat

第一次接触 wpf,但一上来就要改功能。一脸懵逼百度了一下午,没找到解决方法 求解

2719 次点击
所在节点    程序员
17 条回复
BadCat
2017-12-07 15:06:07 +08:00
BadCat
2017-12-07 15:09:46 +08:00

用 FindName 查控件 结果是 null 脑袋大
yaozhenxing
2017-12-07 16:10:50 +08:00
好像要加 x:name="jyly" 三年前写过 wpf
ragnaroks
2017-12-07 16:13:03 +08:00
@yaozhenxing
x:Name==Name 但 x:Name!==Name

this.JYLY 能否取到?或者你取的时候,这个窗口的对象是否存在?
BadCat
2017-12-07 16:15:32 +08:00
@yaozhenxing x:Name 也试过了 同样不行
@ragnaroks 这个 textblock 是在 DataGrid.Columns 里的 窗口对象什么意思 usercontrol 吗
nannanziyu
2017-12-07 16:19:09 +08:00
在 DataTemplate 里,不能这样访问
用 VisualTreehelper 递归下去找
添加下面的扩展方法,然后 this.Layout.FindDescendants<TextBlock>().Where(x=>x.Name == "NAME")

https://gist.github.com/gragrance/df3b78931df27a79801c234a37a39cac
jitongxi
2017-12-07 16:21:37 +08:00
微软的毛玩意出问题很正常.........
我见识过各种各样的. 写 wpf 的时候
nannanziyu
2017-12-07 16:23:27 +08:00
@jitongxi
来把你所有能找到 WPF 的所谓 bug 列出来,我给你一一解答
BadCat
2017-12-07 16:33:31 +08:00
@nannanziyu Name 和 x:Name 查出来的都是 null
BadCat
2017-12-07 16:35:35 +08:00
忘了说了 有 4 个 DataGridTemplateColumn,每个里面结构都是这样的
<DataGridTemplateColumn Header="检验领域" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock x:Name="JYLY" Text="{Binding Path=MethodField,
UpdateSourceTrigger=PropertyChanged}"
FontSize="13" Background="Transparent" HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
nannanziyu
2017-12-07 16:35:54 +08:00
@BadCat
首先你要保证元素已经被加载到了可视化树上
比如你在界面上已经能看到了之后,才能在可视化树上查到
比如你在构造函数里是查不到的
nannanziyu
2017-12-07 16:41:26 +08:00
@BadCat
而且你这样找到元素也没有意义,它作为 Cell,是会根据数据源创建出多个来的
你应该做的是访问它对应的 ViewModel,然后设 MethodField
jitongxi
2017-12-07 16:46:58 +08:00
@nannanziyu 16 年的时候写的时候, 布局文件的缓存干扰过好几次.
BadCat
2017-12-07 16:47:02 +08:00
@nannanziyu 确实是这样,现在的目的就是给 TextBlock 赋值,但是这个 binding 我又不会用 搞了半天没搞出个头绪,想用.Text 直接给 TextBlock 赋值。。。。现在的话,我觉得我还是继续看下 binding 吧
nannanziyu
2017-12-07 16:51:59 +08:00
@BadCat
你去找 DataGrid 设置 ItemSource 的地方
这个 ItemSource 一定是一个列表,列表的每一个元素就是对应最终表格的一行
这个元素里对应的 MethodField 被绑定到了 TextBlock 上,你只需要改变 MethodField 的值就可以改变显示的文本了
nannanziyu
2017-12-07 16:56:15 +08:00
@BadCat
推荐一个 snoop
https://github.com/cplotts/snoopwpf
wpf 界面开发必备,查可视化树,动态观察和设置 VM 等等( vs2017 也自带了 Live Visual Tree )
BadCat
2017-12-07 17:05:17 +08:00
@nannanziyu 我去试一下 多谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/412804

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX