Как перебрать элементы управления в WPF - PullRequest
2 голосов
/ 19 мая 2011

У меня есть простой 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>

EDIT Проблема решена. Я использовал код при управлении языком в моих плагинах. Но MainWindow1.Loaded не был вызван. Если Window не загружен, этот код не работает. Если Window загружен, этот код работает.

Ответы [ 3 ]

1 голос
/ 19 мая 2011

Метод VisualTreeHelper.GetChild не повторяется. Если вы хотите рекурсию, попробуйте использовать Linq-To-VisualTree , например,

var textBlocks = ctl.Descendants<TextBlock>();
1 голос
/ 19 мая 2011

Это зависит от того, какой контроль вы передаете как ctl

Если вы пройдете окно, вы получите границу

Если вы пройдете сетку (макет), вы получитедочерняя сетка.

РЕДАКТИРОВАТЬ

Я только что заметил эту строку

Dim ctl As FrameworkElement = Me.MainWindow

Измените ее на:

Dim ctl As FrameworkElement = Me

РЕДАКТИРОВАТЬ2

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
1 голос
/ 19 мая 2011

Вы должны вызывать свою функцию рекурсивно для каждого дочернего элемента управления.То есть в следующей строке вы получите дочерний элемент ctl:

Dim Child As FrameworkElement = VisualTreeHelper.GetChild(ctl, i)

После этого вам нужно будет выполнить итерации по дочерним элементам Child.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...