我有一个简单的XAML文件,其中包含网格和文本框。但是当使用我的代码时,它不会通过迭代找到文本框。
VB.Net:
Dim ctl As FrameworkElement = Me.MainWindow
代码:
Dim ChildrenCount As Integer = VisualTreeHelper.GetChildrenCount(ctl)
'ChildrenCount is always zero
For i As Integer = 0 To ChildrenCount - 1
Dim Child As FrameworkElement = VisualTreeHelper.GetChild(ctl, i)
Call SetLanguageToControls(Keyword, cLanguage, Child)
Next
XAML:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Icon="/OUTPUT%20-%20Histogram;component/Sprectrum.ico">
<Grid x:Name="LayoutRoot">
<Grid x:Name="SpectrumContent" Margin="8" Height="120" Width="320">
<Rectangle Grid.Row="0" Grid.Column="1" Opacity="0.5">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
<GradientStop Offset="0" Color="Black" />
<GradientStop Offset="1" Color="White" />
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<TextBlock x:Name="txtRedMin" Text="|Red:" Foreground="Red" FontWeight="Bold" />
<TextBlock x:Name="txtRedMinValue" Text="000%" />
</Grid>
</Grid>
</Window>
修改 问题解决了。我在插件中管理语言时使用了代码。但没有调用MainWindow1.Loaded。如果未加载Window,则此代码不起作用。如果加载了Window,则此代码有效。
答案 0 :(得分:1)
您必须为每个子控件递归调用您的函数。也就是说,在以下行中,您会得到ctl
的孩子:
Dim Child As FrameworkElement = VisualTreeHelper.GetChild(ctl, i)
在此之后,您需要迭代Child
的孩子。
答案 1 :(得分:1)
VisualTreeHelper.GetChild
方法无法递归。如果您想要递归,请尝试使用Linq-To-VisualTree,例如
var textBlocks = ctl.Descendants<TextBlock>();
答案 2 :(得分:1)
这取决于您传递的控件为ctl
如果您通过窗口,您将获得边框
如果您传递网格(布局),您将获得子网格。
修改强>
我刚注意到这一行
Dim ctl As FrameworkElement = Me.MainWindow
将其更改为:
Dim ctl As FrameworkElement = Me
<强> EDIT2 强>
Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
Dim ctl As FrameworkElement
ctl = LayoutRoot
Dim ChildrenCount As Integer = VisualTreeHelper.GetChildrenCount(ctl)
For i As Integer = 0 To ChildrenCount - 1
Dim Child As FrameworkElement = VisualTreeHelper.GetChild(ctl, i)
Debug.WriteLine(Child.ToString() + ": " +
VisualTreeHelper.GetChildrenCount(Child).ToString())
Next
End Sub