Как разместить рамку вокруг ItemsControl?
-
13-09-2019 - |
Вопрос
У меня есть элемент управления с настраиваемой панелью внутри пользовательского элемента управления.Размер пользовательских элементов управления ограничен только размером родительского окна.
<UserControl>
<Grid>
<Border BorderBrush="DarkGray" BorderThickness="5">
<ItemsControl ItemsSource="{Binding ActiveGame.Grid.CellsFlat}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Wpf:HexagonalPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
</Grid>
</UserControl>
Теперь я хочу, чтобы граница рисовалась только вокруг полученной панели.Но вместо этого он рисуется вокруг всей сетки или, точнее, того же размера, что и сетка.
Я думаю, что я правильно реализовал MeasureOverride на своей HexagonalPanel, он возвращает правильный размер, поэтому разве он не должен рисовать границу такого размера?
Что мне не хватает?
Решение
Вы не указали размер ItemsControl
, поэтому он также будет иметь размер своего родителя.Попробуйте установить ItemsControl
's HorizontalAlignment
и VerticalAlignment
к Center
;это сделает ItemsControl
Фактический размер соответствует размеру его содержимого.
Другие советы
ItemsControl
у себя есть BorderBrush
и BorderThickness
характеристики.Вы, вероятно, захотите использовать их, поскольку ItemsControl
имеет Border
в своем ControlTemplate
по умолчанию.
вы можете добиться этого, рассчитав и обновив новое значение размера:
public class MyPanel : Panel{
protected override Size ArrangeOverride(Size finalSize){
// calculate new size
........
this.SetValue(WidthProperty, totalwidth);
this.SetValue(HeightProperty, totalheight);
return new Size(totalwidth, totalheight);
}
}