Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 使用x:Name=”操纵可见性;作为代码中的字符串_Wpf_Vb.net - Fatal编程技术网

Wpf 使用x:Name=”操纵可见性;作为代码中的字符串

Wpf 使用x:Name=”操纵可见性;作为代码中的字符串,wpf,vb.net,Wpf,Vb.net,是否可以在VB.Net+WPF中使用x:Name=“作为字符串来操纵元素的可见性和其他选项 我试过的东西 Dim w As MainWindow = Application.Current.Windows(0) 'Dim nameOfControl As String = ("buttonClose") w.[nameOfControl].Visibility = Visibility.Visible outpus和我预期的一样,控件名不是主窗口的成员 我的最终结果应该是根据数据库信息操作(可

是否可以在VB.Net+WPF中使用
x:Name=“
作为字符串来操纵元素的可见性和其他选项

我试过的东西

Dim w As MainWindow = Application.Current.Windows(0)
'Dim nameOfControl As String = ("buttonClose")
w.[nameOfControl].Visibility = Visibility.Visible
outpus和我预期的一样,
控件名
不是主窗口的成员
我的最终结果应该是根据数据库信息操作(可视化)所有gui元素。

Edit2:修复了一个只返回匹配类型的第一个子元素的错误

编辑:在进一步研究之后,似乎与C#和VB.Net中的扩展方法有一些实质性的区别。我做了一些更改,希望能够解释这些更改

以下方法将获取给定视觉对象的所有子对象(窗口是视觉对象):

如果您知道子控件的类型,则可以替换FrameworkElement。请注意,如果有多个子控件具有相同的名称,则只返回其中一个子控件。如果要获取所有子控件,请使用Where()而不是FirstOrDefault()

免责声明:我是一名C#程序员,所有这些VB.Net代码都是使用telerik找到的转换器从C#转换成VB的。这些代码中可能有语法或其他错误。

(事实证明OP需要在循环中按字符串名称查找任意控件——这在理想情况下是通过MVVM和重新设计完成的,但目前的答案是遍历可视化树)

你已经差不多明白了

Dim w As MainWindow = Application.Current.Windows(0)
w.buttonClose.Visibility = Visibility.Collapsed
在控件上放置
x:Name
属性时,WPF为具有该名称的控件的父类(
MainWindow
)提供
Friend
属性。
Friend
(C#称之为
internal
)表示同一程序集中的任何代码都可以访问它。
w
是对您的
main窗口
类的引用,所以它就在这里


因此,假设此代码与
main window
位于同一程序集中,应该可以工作。

使用
w.buttonClose
@Ed,这是一个私人成员。这是一个好的开始吗?你能给我一个例子在我的代码中看到它吗?@Clemens很好,的确如此。实际上编译器告诉我这没问题。@Clemens他们都是显式
internal
——在VB中称为
Friend
。上面出现的代码是我缺少的部分,我可以将'nameOfControl'指定为字符串,但我不能将'nameOfControl'用作字符串来调用w.“nameOfControl”".visibility@Thomas你是说你需要按名称触摸任意的子控件,其中名称是字符串?在这种情况下,Brandon Kramer的答案可能正是你想要的。@Thomas让我重申一下:你需要的是MVVM。你正在寻找一种避免MVVM的方法,可能是出于学习曲线的原因(这是可以理解的,但痛苦最终还是会为自己付出高昂的代价).mvvm对这种应用程序来说是不是太过分了?我刚刚在谷歌上搜索了一下,似乎我可以用mvvm来实现这一点,但最后,我只需要为输出中的每个s做一个`s,返回s Dim nameOfControl=s Dim child=visuals.OfType(FrameworkElement的)().FirstOrDefault(函数(x)x.名称=控件名称)child.Visiablity=Visibility.Collapsed Next`我的意思是,我将查询数据库,对于从数据库中获取的每个字符串,我希望删除该控件的可见性@EdPlunkett@Thomas我可能夸大了这一点。一旦你了解了MVVM,它就变得简单和自然了——但正如我所说的,学习曲线不是sma如果Brandon的东西能让你在项目中度过难关,我会用它。不要用一个小时的工作时间来换取两周的学习一个新的编程范例,除非学习新的编程范例是真正的目标(这里我推断不是)。但是如果你打算长期使用WPF,我会认真地咬MVVM的子弹。我现在还不能说这是可行的,但只要我测试它并修复vb.net差异,我就会更新我的问题。我有以下错误:for
'Dim visuals=window.GetVisualChildren(属于FrameworkElement)()“
Microsoft.VisualBasic.dll中发生System.MissingMemberException”类型的异常,但未在用户代码中处理其他信息:重载解析失败,因为没有可访问的“GetVisualChildren”接受此数量的参数。是否知道为什么会发生这种情况?Visual Studio在运行应用程序之前不会显示任何错误应用程序听起来您的代码出于某种原因无法访问GetVisualChildren方法。您是否将GetVisualChildren方法放置在可以通过代码访问的位置以获取子对象?您是否看到GetVisualChildren具有Intellisense?谢谢您,先生,您救了我。现在我要学习MVVM。您是一颗真正的宝石!
Dim window = Application.Current.Windows(0)
Dim visuals = window.GetVisualChildren(Of FrameworkElement)()
Dim nameOfControl = "NameOfControl"
Dim child = visuals.OfType(Of FrameworkElement)().FirstOrDefault(Function(x) x.Name = nameOfControl)
child.Visiablity = Visibility.Collapsed
Dim w As MainWindow = Application.Current.Windows(0)
w.buttonClose.Visibility = Visibility.Collapsed