如何在WPF中迭代控件

时间:2011-05-19 11:02:27

标签: wpf vb.net xaml controls iterator

我有一个简单的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,则此代码有效。

3 个答案:

答案 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