Я могу ошибаться.Но похоже, что ваш базовый класс - 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>