Windows phone 7 Listbox ArrangeOverride не работает? - PullRequest
2 голосов
/ 31 марта 2012

Я переопределяю метод ArrangeOverride списка, хочу показать itemSource следующим образом: (я сопоставляю DependencyObject с методом PrepareContainerForItemOverride)

1 2 3 4
5 6 7 8
.....
...... 100

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

1
2
3
4
5
......
100

protected override Size ArrangeOverride(Size finalSize)
    {
        if (this._ItemsDictionary.Count <= 0)
        {
            return base.ArrangeOverride(finalSize);
        }
        base.ArrangeOverride(finalSize);
        finalSize = this.MeasureOverride(_availableSize);

        double xMemory = 0;
        double yMemory = 0;
        double maxBoderWidth = 0;
        double maxHeight = 0;

        foreach (FrameworkElement element in _ItemsDictionary.Values)
        {
            if (xMemory + element.DesiredSize.Width <= finalSize.Width)
            {
                element.Arrange(new Rect(xMemory, yMemory, element.DesiredSize.Width, element.DesiredSize.Height));
                xMemory += element.DesiredSize.Width;
                maxHeight = Math.Max(element.DesiredSize.Height, maxHeight);
            }
            else
            {
                yMemory += maxHeight;
                maxBoderWidth = Math.Max(maxBoderWidth, xMemory);
                xMemory = 0;
                maxHeight = 0;

                element.Arrange(new Rect(xMemory, yMemory, element.DesiredSize.Width, element.DesiredSize.Height));
                xMemory += element.DesiredSize.Width;
                maxHeight = Math.Max(element.DesiredSize.Height, maxHeight);
            }
        }
        return finalSize;
    }

    protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        base.PrepareContainerForItemOverride(element, item);
        FrameworkElement fElement = element as FrameworkElement;
        if (!_ItemsDictionary.ContainsKey(item))
        {
            _ItemsDictionary.Add(item, fElement);
        }
    }

1 Ответ

2 голосов
/ 31 марта 2012

Я могу ошибаться.Но похоже, что ваш базовый класс - ItemsPresenter (или что-то унаследованное от него, например ListBox ).Это не хорошая идея.Потому что КАЖДЫЙ ItemsPresenter имеет свой собственный ItemsPanel !И Silverlight используют эту панель для размещения элементов.Поэтому ItemsPresenter не может размещать свои собственные элементы напрямую, только панель ItemsPanel .

1) Я рекомендую вам использовать WrapPanel (чтоявляется частью Silverlight SDK), так что у вас есть его бесплатно, я думаю, это то, что вы хотите.Просто замените свойство ListBox.ItemsPanel на WrapPanel , и вы получите желаемый результат

2) Если вы хотите создать свою собственную панель, вам лучше создать новый класс и унаследовать его от Panel

public class SomeNewPanel: Panel
{
    protected override System.Windows.Size MeasureOverride(System.Windows.Size availableSize)
    {
        //you can add here your custom measure logic
        return base.MeasureOverride(availableSize);
    }

    protected override System.Windows.Size ArrangeOverride(System.Windows.Size finalSize)
    {
        //you can add here your custom arrange logic
        return base.ArrangeOverride(finalSize);
    }
}

и затем используйте его в ListBox следующим образом.

<Page x:Class="SilverlightApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    <!--Don't forget to add namespace of your newly created panel-->
    xmlns:local="clr-namespace:SilverlightApplication1"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <ListBox x:Name="listBox1" ItemsSource="{Binding SomeItemSource}">
        <!--ItemPanel property set or get Panel that-->
        <!--will be used for layouting items-->
        <ListBox.ItemsPanel>

            <!--Here you and your newly created panle-->
            <local:SomeNewPanel/>

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