Установите Высота первого ListBoxItem как разность других элементов в WP7 - PullRequest
2 голосов
/ 10 апреля 2011

Мне нужно показать список элементов в ListBox снизу в WP7. Поэтому в случае, если у меня есть некоторые элементы, сумма которых для высоты равна

Я должен сделать это, потому что я установил ItemSource в Listbox, поэтому я не могу знать, какова правильная высота всех элементов, прежде чем загружать их.

В событии Item_loaded для каждого предмета я сохраняю высоту, а в конце мне нужно установить высоту первого.

<ListBox x:Name="ConvListBox" Margin="0,0,-12,0" >
            <ListBox.ItemTemplate  >
                <DataTemplate >
                    <Grid>
                        <StackPanel Name="BaloonMessage" Margin="3,0,0,0" Loaded="Baloon_Loaded" Tag="{Binding IsSentMsg}" >
                        <TextBlock Name="SMSText" Text="{Binding SMSText}" Margin="7,3,8,35" TextWrapping="Wrap" Height="Auto" Width="Auto" FontSize="22" Foreground="White"/>
                        </StackPanel>
                   </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Я установил ItemsSource и добавил пустой элемент вверху, а пустой внизу:

            ObservableCollection<ClassMessaggio> messaggi =
                new ConversazioneViewModel(MessaggioConversazione).Conversazione;

            ClassMessaggio FirstLineScrollMessage = new ClassMessaggio();
                            FirstLineScrollMessage.IsSentMsg = "3";
                            messaggi.Insert(0, FirstLineScrollMessage); 

            ClassMessaggio LastLineScrollMessage = new ClassMessaggio();
                            LastLineScrollMessage.IsSentMsg = "2";
                            messaggi.Insert(messaggi.Count, LastLineScrollMessage);

            this.ConvListBox.ItemsSource = messaggi;

И в Item_Loaded я пытаюсь это:

var Panel = (StackPanel) sender;
        if (Panel != null)
        {
            Grid grid = (Grid)Panel.Parent;

            Border baloon = (Border)Panel.FindName("Baloon");
            baloon.Width = grid.Width - 100;

            if (Panel.Tag.ToString() == "3")
            {
                TotalBaloonsHeight = 0;

                baloon.Background = grid.Background;
                baloon.Name = "FirstScrollBaloon";
            }
            else if (Panel.Tag.ToString() == "2")
            {
                baloon.Height = 2;
                Panel.Height = 2;
                grid.Height = 2;

                Border FirstBaloon = (Border)ConvListBox.FindName("FirstScrollBaloon");                       
                if (FirstBaloon != null)
                {
                    FirstBaloon.Height =  ConvListBox.Height - TotalBaloonsHeight;
                }

            }
            else
            {
            TotalBaloonsHeight = TotalBaloonsHeight + baloon.Height;

            }

        }

Моя проблема в том, что эта строка возвращает мне всегда ноль :(

  Border FirstBaloon = (Border)ConvListBox.FindName("FirstScrollBaloon");                       

Надеюсь понятно, извините за мой английский.

EDIT ::

Хорошо, это должно работать:

var Baloons = LayoutRoot.GetVisualDescendants().OfType<Border>();
                   foreach (var FirstBaloon in Baloons)
                    {
                        if (FirstBaloon != null)
                        {
                            if (FirstBaloon.Name == "FirstScrollBaloon")
                            {
                                FirstBaloon.Height = ConvListBox.ActualHeight - TotalBaloonsHeight;
                                break;
                            }
                        }
                    }        

1 Ответ

3 голосов
/ 10 апреля 2011

Вы можете добраться до первого ListBoxItem, используя этот код:

ListBoxItem item0 = ConvListBox.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;

Оттуда вы можете изменить его высоту и т. Д.

Спасибо, Стефан Вик - Microsoft Silverlight

...