首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows phone 7列表框ArrangeOverride无法工作?

Windows phone 7列表框ArrangeOverride无法工作?
EN

Stack Overflow用户
提问于 2012-03-31 10:53:17
回答 1查看 242关注 0票数 2

我重写了列表框的ArrangeOverride方法,希望像这样显示itemSource:(我在PrepareContainerForItemOverride方法上整理DependencyObject )

1 2 3 4

5 6 7 8

.

......100

但是当我滚动滚动条时,数组的变化是这样的:

1

2

3.

4.

5

.

100

代码语言:javascript
复制
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);
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2012-03-31 11:58:34

我可能错了。但是您的基类似乎是ItemsPresenter (或从它继承的东西,如ListBox)。这不是一个好的idia。因为每个ItemsPresenter都有自己的ItemsPanel!和Silverlight使用此面板对项目进行布局。因此ItemsPresenter不能直接布局它自己的项目,只能使用ItemsPanel面板。

1)我推荐你使用WrapPanel (它是Silverlight SDK的一部分),这样你就可以免费使用它了,我想这就是你想要的。只需用WrapPanel替换ListBox.ItemsPanel属性,您就会得到想要的结果

2)如果你想创建你自己的面板,你最好创建新的类并从Panel继承它

代码语言:javascript
复制
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中使用它。

代码语言:javascript
复制
<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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9952594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档