如何在使用集线器时从CB访问控件-Windows Phone 8.1

本文关键字:控件 访问 -Windows Phone CB 集线器 | 更新日期: 2023-09-27 18:30:01

我正在Windows Phone 8.1和我想从Code Behind获得对控件的访问权限。

通常情况下,一切都很好,但当我使用hub时,我无法访问CodeBehind中的字段。

<Hub x:Name="RHub">
        <HubSection>
            <DataTemplate>
                <Grid>
                   <TextBox x:Name="Test5"/>
                </Grid>
            </DataTemplate>
        </HubSection>
        <HubSection>
            <DataTemplate>
                <Grid>
                </Grid>
            </DataTemplate>
        </HubSection>
</Hub>

现在在CodeBehind文件中并没有像Test5这样的字段,只有RHub。

如何在使用集线器时从CB访问控件-Windows Phone 8.1

这是因为控件位于DataTemplate内部。绕过这个限制的一个简单方法是挂接Element Loaded事件。这是XAML:

<HubSection Header="Trailers">
    <DataTemplate>
        <ListView x:Name="MovieTrailers" Loaded="MovieTrailers_Loaded">
        </ListView>
    </DataTemplate>
</HubSection>

以及背后的代码:

private void MovieTrailers_Loaded(object sender, RoutedEventArgs e)
{
    var listView = (ListView)sender;
    listView.ItemsSource = trailers;
}

如果你想在列表视图中搜索任何元素,你可以使用这样的方法:

public static DependencyObject FindChildControl<T>(DependencyObject control, string ctrlName)
{
    int childNumber = VisualTreeHelper.GetChildrenCount(control);

    for (int i = 0; i < childNumber; i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(control, i);
        FrameworkElement fe = child as FrameworkElement;
        // Not a framework element or is null
        if (fe == null) return null;
        if (child is T && fe.Name == ctrlName)
        {
            // Found the control so return
            Debug.WriteLine("Achou");
            return child;
        }
        else
        {
            // Not found it - search children
            DependencyObject nextLevel = FindChildControl<T>(child, ctrlName);
            if (nextLevel != null)
                return nextLevel;
        }
    }
    return null;
}

和搜索:

private void findRectangle(ListView listView)
{
    Rectangle ret = this.FindChildControl<Rectangle>(listView, "ret1") as Rectangle;
    if(ret != null)
    {
        ret.Fill = new SolidColorBrush(this.color);
    }
}