Как получить UIElement на определенной позиции в ItemsControl в WP7? - PullRequest
0 голосов
/ 29 января 2012

Я заполнил icBoard 50 Cell объектами, поэтому каждый Rectangle объект имеет Cell в качестве объекта данных. Теперь я хочу по индексу или объекту ячейки получить соответствующий элемент Rectangle. Например, я хочу получить Rectangle в index=15. Не это данные, а сама Rectangle.

Как я могу это сделать?

        public MainPage()
        {
            InitializeComponent();

            var cells = new List<Cell>();    
            for (int i = 0; i < 50; i++)
            {
                cells.Add(new Cell());
            }    
            icCells.ItemsSource = cells;
        }
       public void sector_Tap(object sender, System.Windows.Input.GestureEventArgs e)
       {
            //some code
            //....
            var tappedRectangle = (sender as Rectangle);
            var spesificRectangle = SOMEHOW_GET_RECTANGLE_AT_POSITION_15;
       }
    <ItemsControl Name="icBoard" Grid.Column="0" Margin="0">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Rectangle  Fill="#501e4696" Width="30" Height="30" Margin="1" Tap="sector_Tap" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <toolkit:WrapPanel />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>

1 Ответ

2 голосов
/ 29 января 2012

Я считаю, что это может сработать:

ContentPresenter contentPresenter = itemsControl.ItemContainerGenerator.ContainerFromIndex(15) as ContentPresenter;
Rectangle rectangle= FindVisualChild<Rectangle>(contentPresenter );
if (rectangle != null)
{

}

public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            {
                return (T)child;
            }

            T childItem = FindVisualChild<T>(child);
            if (childItem != null) return childItem;
        }
    }
    return null;
}
...