визуальные элементы текущей сводной страницы

Я использую C#, Silverlight, Visual Studio для Windows Phone 7.

Меня интересует получение только тех визуальных элементов, которые в данный момент отображаются на экране во время разворота. Например, мой свод может иметь 5 элементов сводки, но я хочу получать только те элементы, которые отображаются после каждого щелчка.

Прямо сейчас я могу получить всю сводную информацию из визуального дерева, и, очевидно, я мог бы выбрать конкретный элемент сводной таблицы. Но я хочу иметь возможность получить только текущую точку поворота на экране. Конечная цель — получить абсолютное положение элементов на экране независимо от текущего PivotItem.

Это возможно? Если да, то как?


person joulesm    schedule 11.09.2012    source источник


Ответы (1)


SelectedItem и/или SelectedIndex в Pivot вернет видимый в данный момент PivotItem.

Пример кода для вас, чтобы проиллюстрировать мою точку зрения:

XAML:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <!--Pivot Control-->
    <controls:Pivot x:Name="SomePivot" Title="MY SAMPLE PIVOT">
            <StackPanel>
                <Button Content="Button 0"/>
                <Button Content="Button 1"/>
                <Button Content="Button 2"/>
                <Button Content="Button 3"/>
                <Button Content="Button 4"/>
                <Button Content="Button 5"/>
                <Button Content="Button 6"/>
                <Button Content="Button 7"/>
                <Button Content="Button 8"/>
                <Button Content="Button 9"/>
                <Button Content="Button 0"/>
                <Button Content="Button 1"/>
                <Button Content="Button 2"/>
                <Button Content="Button 3"/>
                <Button Content="Button 4"/>
                <Button Content="Button 5"/>
                <Button Content="Button 6"/>
                <Button Content="Button 7"/>
                <Button Content="Button 8"/>
                <Button Content="Button 9"/>
            </StackPanel>
        </controls:PivotItem>
        <controls:PivotItem Header="item2">
            <Button Content="Button D" Name="B"/>
        </controls:PivotItem>
        <controls:PivotItem Header="item3">
            <Button Content="Button D" Name="C"/>
        </controls:PivotItem>
        <controls:PivotItem Header="item4">
            <Button Content="Button D" Name="D"/>
        </controls:PivotItem>
    </controls:Pivot>

    <Button Grid.Row="1" Content="Get Current Pivot Item" Click="GetCurrentPivotItem"/>
</Grid>

Код позади:

private void GetCurrentPivotItem(object sender, RoutedEventArgs e)
{
    PivotItem pivotItem = (PivotItem)SomePivot.SelectedItem;
    Debug.WriteLine("Pivot Item : {0}", pivotItem.Header);
    foreach (var element in VisualTreeHelper.FindElementsInHostCoordinates(new Rect(20, 0, 480, 700), pivotItem))
    {
        if (element is Button)
        {
            Debug.WriteLine("{0}", ((Button)element).Content);
        }
    }
}

Это помогает?

person Gros Lalo    schedule 11.09.2012
comment
Спасибо!! Да!! Интересно то, что в настоящее время я запускаю свои методы через событие LayoutUpdated, которое, как ни странно, вызывается всего несколько раз. Допустим, у меня есть 5 опор. LayoutUpdated запускается во время первых 3 щелчков, но больше никогда. Любая идея, почему это? - person joulesm; 12.09.2012
comment
С тех пор я изменил свой код, так что этот метод вызывается PivotSelectionChanged. Все еще любопытно, почему LayoutUpdated вызывается только несколько раз, прежде чем он остановится. - person joulesm; 12.09.2012
comment
Для справки в будущем лучше использовать событие LoadedPivotItem, а не PivotSelectionChanged, так как тогда вы сможете получить элементы, когда они закончат поворот. - person joulesm; 12.09.2012