- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C# WPF 父控件通过使用可视化树找到子控件的示例代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在我们使用wpf设计前台界面时,经常会重写数据模板,或者把控件放到数据模板里。但是一旦将控件放到数据模板中,在后台就没有办法通过控件的名字来获取它了,更没办法对它进行操作(例如,隐藏,改变控件的某个值).
如果你是比我还白的小白,对我刚刚陈述的东西不清楚,接下来我简单说一下什么是把控件放在数据模板中,怎么样的情况没法后台通过名字来获取控件,如果读者对于数据模板这些事儿已经清楚了,或者只关心如何使用可视化树可以将这部分跳过哈.
先上代码介绍一下什么是数据模板以wpf中listbox控件为例:
1
2
3
4
5
6
7
|
<listbox name=
"listbox_1"
horizontalalignment=
"left"
height=
"299"
margin=
"10,10,0,0"
verticalalignment=
"top"
width=
"497"
mousedoubleclick=
"listbox_1_onmousedoubleclick"
>
<listbox.itemtemplate>
<datatemplate>
<button name=
"button_1"
content=
"666"
></button>
</datatemplate>
</listbox.itemtemplate>
</listbox>
|
我在后台设置了显示了8行item,效果如下:
我们可以看到重写数据模板实现的效果是在listbox的每一项item都是一个button,这里介绍的只是一些简单应用例子,重写模板是很强大的。因为如果用到可视化树多半是因为使用了数据模板在后台用名字无法找到相应控件了,所以在此简单介绍一下,方便理解.
接下来我们在后台尝试通过控件的名字来找到我们的listbox和button 。
我们发现通过控件的名字可以找到listbox但是通过button的名字却无法找到button,这就是数据模板搞的鬼.
但是没有关系,我们可以通过可视化树从listbox里找到它的子控件我们想要的这个button.
重点来了,先上代码,可视化树通过父控件找到它的子控件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
list<t> findvisualchild<t>(dependencyobject obj) where t : dependencyobject
{
try
{
list<t> list =
new
list<t>();
for
(
int
i = 0; i < visualtreehelper.getchildrencount(obj); i++)
{
dependencyobject child = visualtreehelper.getchild(obj, i);
if
(child
is
t)
{
list.add((t)child);
list<t> childofchildren = findvisualchild<t>(child);
if
(childofchildren !=
null
)
{
list.addrange(childofchildren);
}
}
else
{
list<t> childofchildren = findvisualchild<t>(child);
if
(childofchildren !=
null
)
{
list.addrange(childofchildren);
}
}
}
return
list;
}
catch
(exception)
{
//messagebox.show(ee.message);
return
null
;
}
}
|
先将上面的方法复制到你的项目当中,此时对于可视化树的应用已经完成一半了.
接下来上代码,通过可视化树双击listbox的ltem把对应的button的content值从666改成777:
1
2
3
4
5
6
7
8
9
|
private
void
listbox_1_onmousedoubleclick(
object
sender, mousebuttoneventargs e)
{
listboxitem mylistboxitem = (listboxitem)listbox_1.itemcontainergenerator.containerfromitem(listbox_1.selecteditem);
list<button> btnlist = findvisualchild<button>(mylistboxitem);
foreach
(var item
in
btnlist)
{
item.content =
"777"
;
}
}
|
效果就是双击哪个item哪个item中的button从666变成了777.
我们通过父控件找到了里面的子控件button,我们便可以对它进行任何操作(和用名字找到是一样的).
以上关于可视化树的代码可以应用于listbox,datagrid,listview,treeview,对于“.itemcontainergenerator.containerfromitem”这段代码的含义我暂时不是很理解,欢迎指教和交流.
通过以上的例子相信读者已经可以使用可视化树找到相应的控件了,但在我的开发过程中曾遇到过一些问题,和对于使用可视化树的一点小建议.
1.如果你在使用可视化树执行“listboxitem mylistboxitem = (listboxitem)listbox_1.itemcontainergenerator.containerfromitem(listbox_1.selecteditem);”这句返回值是空(实际上不是空),可能是因为界面没有初始化完毕,我的理解是,在前台这个控件还没生成完毕,或者是你修改了值但前台还没有修改,可以加上这句:
控件名.updatelayout(),
之后在使用可视化树,这一条的说法和形容可能有点不严谨,欢迎指正交流.
2.可视化树使用的是递归的方法,所以它的效率不是很高,如果在程序中大量使用可视化树,会使得程序变慢的.
3.调用可视化树返回的列表如果没有找到相应的控件或是异常便会返回空值,所以建议在你遍历可视化树返回的列表时,请先判断否非为空.
补充:wpf查找子控件和父控件方法 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
1、查找某种类型的子控件,并返回一个list集合
public
list<t> getchildobjects<t>(dependencyobject obj, type typename) where t : frameworkelement
{
dependencyobject child =
null
;
list<t> childlist =
new
list<t>();
for
(
int
i = 0; i <= visualtreehelper.getchildrencount(obj) - 1; i++)
{
child = visualtreehelper.getchild(obj, i);
if
(child
is
t && (((t)child).gettype() == typename))
{
childlist.add((t)child);
}
childlist.addrange(getchildobjects<t>(child,typename));
}
return
childlist;
}
调用:
list<button> listbuttons = getchildobjects<button>(parentpanel,
typeof
(button));
//parentpanel就是xaml里定义的控件的x:name
2、通过名称查找子控件,并返回一个list集合
public
list<t> getchildobjects<t>(dependencyobject obj,
string
name) where t : frameworkelement
{
dependencyobject child =
null
;
list<t> childlist =
new
list<t>();
for
(
int
i = 0; i <= visualtreehelper.getchildrencount(obj) - 1; i++)
{
child = visualtreehelper.getchild(obj, i);
if
(child
is
t && (((t)child).gettype() == name |
string
.isnullorempty(name)))
{
childlist.add((t)child);
}
childlist.addrange(getchildobjects<t>(child,name));
}
return
childlist;
}
调用:
list<button> listbuttons = getchildobjects<button>(parentpanel,
"button1"
);
3、通过名称查找某子控件:
public
t getchildobject<t>(dependencyobject obj,
string
name) where t : frameworkelement
{
dependencyobject child =
null
;
t grandchild =
null
;
for
(
int
i = 0; i <= visualtreehelper.getchildrencount(obj) - 1; i++)
{
child = visualtreehelper.getchild(obj, i);
if
(child
is
t && (((t)child).name == name |
string
.isnullorempty(name)))
{
return
(t)child;
}
else
{
grandchild = getchildobject<t>(child, name);
if
(grandchild !=
null
)
return
grandchild;
}
}
returnnull;
}
调用:
stackpanel sp = getchildobject<stackpanel>(
this
.layoutroot,
"spdemopanel"
);
4、通过名称查找父控件
public
t getparentobject<t>(dependencyobject obj,
string
name) where t : frameworkelement
{
dependencyobject parent = visualtreehelper.getparent(obj);
while
(parent !=
null
)
{
if
(parent
is
t && (((t)parent).name == name |
string
.isnullorempty(name)))
{
return
(t)parent;
}
parent = visualtreehelper.getparent(parent);
}
returnnull;
}
调用:
grid layoutgrid = vthelper.getparentobject<grid>(
this
.spdemopanel,
"layoutroot"
);
|
总结 。
以上所述是小编给大家介绍的c# wpf 父控件通过使用可视化树找到子控件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:https://www.cnblogs.com/hellohxs/p/9528408.html 。
最后此篇关于C# WPF 父控件通过使用可视化树找到子控件的示例代码的文章就讲到这里了,如果你想了解更多关于C# WPF 父控件通过使用可视化树找到子控件的示例代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想实现自定义搜索,但遇到了一个麻烦。我需要将 UIButton、SearchBar 组合在一个控件中,以便我可以通过指针引用它。然后我将向该组合控件动态添加更多 UIbutton。最重要的是,我想将
它没有在我的方法中执行 if block 中的语句 母版页:- 页面加载事件:- Control c = new Control(); DoSomething(c); 我的方法:- protecte
ComboBox 控件有一个 setConverter 方法,请参阅 JavaFX ComboBox - Display text but return ID on selection举个例子。我正在
我没有找到任何包含用于标记化(标记)文本输入的控件的 wpf 库。也许我找不到库,因为我错误地调用了这个组件。怎么叫或者哪里有这样的库? 最佳答案 DevExpress WPF 库包含多个数据编辑控件
是否有 Silverlight 控件允许您输入文本并将其突出显示为代码? 例如: foreach (client in Clients){ client.Save();} would become
我有以下用户控件 a) Panel.ZIndex="99999999" 是否是将此控件设置为该控件中 TopMost 的正
是否可以在 Windows 窗体中使用 C# 在窗体加载时隐藏所有特定控件,例如标签或按钮,然后选择显示我不想显示的那些? 我有一个包含很多按钮和标签的程序,但我只想在加载时显示一两个,我觉得对每个标
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Duplicating components at Run-Time 我有一个TMyControl ( Contro
我正在尝试在 Delphi 中编写一个 dll 库,其中包含一个创建 TFrame 后代实例并返回它的函数。但是当我在应用程序中导入这个函数时,每次调用它时,我都会得到一个异常,例如“'xxx'控件没
是否有 Win32 API 调用来确定哪些窗口和/或控件在特定坐标和/或鼠标下可见? 最佳答案 您可以使用GetWindowFromPoint 。它将返回窗口句柄,以便您可以使用 GetClassNa
我需要在编辑控件中输入以下公式: 公式是在 MS Word 中制作的。尝试将其复制/粘贴到编辑控件(单行或多行)后,我得到 M 0.33 Q10T9.1-9.7。 当我输入这个时,我正在研究 Rich
我只是想成功地将它添加到我的窗口中,但这却出奇地困难。 我已经尝试过 #include "windef.h" #include "winbase.h" #include "initguid.h" #i
我希望能够使用 google maps api v3 拥有自己的“街景”按钮。单击按钮时,我希望它根据我的标记经纬度加载街景。然后我希望按钮更改为“返回 map ”,然后再次加载默认 map View
我目前正在用 PHP 开发(另一个)开源 CMS,我想使用 javascript 控件,尤其是管理面板。问题是,是否有任何具有 PHP 接口(interface)的开源、可自由分发的控件(用于创建 j
我为其编写软件的产品之一是会计类应用程序。它用 C++ 编写,使用 C++ Builder 和 VCL 控件,连接到运行在 Linux 上的 PostgreSQL 数据库。 PostgreSQL 数据
我使用 Key Listener 来读取用户的输入,但我遇到了问题。首先,我读到 JTextField“请输入您的姓名”。如果用户输入一个名字,例如 John,它将更改为 John。但是,如果用户输入
我正在尝试对齐数据表列中的复选框(h=center,v=middle) ... 但复选框仍然显示在错误的位置(见附图)
我有一个包含统计信息的 JSON 数据树: { prefix: "a", count: 20, children: [ { prefix: "a:b", c
我在 Photoshop 中设计了一个模型,我打算将它应用到我的产品目录的 ListView 控件中,但它似乎没有正确显示(未对齐?),我希望这里的人可以像我一样指出我的错误试图弄清楚无济于事。 预期
您是使用 ASP.NET 控件还是仅使用带有 CSS 的 HTML? 我在 TextBox 和 DropDownList 的宽度方面遇到了一些问题。在不同的浏览器中,宽度会有所不同,控件的大小也不会相
我是一名优秀的程序员,十分优秀!