Ранее я портировал ExpanderView из набора инструментов Windows Phone в WinRT ExpanderRT, просто чтобы заметить, что если у вас есть два элемента управления ExpanderView внутри StackPanel или ListView, и вы хотите, чтобы первый расширительView расширялся с самого начала установив для свойства IsExpanded значение True, тогда первый expanderView будет накладывать второй.ExpanderView не будет расширяться изнутри XAML
Вот пример: -
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel>
<local:ExpanderControl
IsExpanded="True"
Expander="This is the expander">
<local:ExpanderControl.Items>
<Button Content="Yes"/>
<Button Content="No"/>
</local:ExpanderControl.Items>
</local:ExpanderControl>
<local:ExpanderControl
IsExpanded="False"
Expander="This is the expander">
<ListViewItem>
<StackPanel Orientation="Horizontal">
<Button Content="yes"/>
<Button Content="no"/>
</StackPanel>
</ListViewItem>
</local:ExpanderControl>
</StackPanel>
</Grid>
Через несколько часов, пытаясь отладки кода управления ExpanderView я узнал, что этот код стрельбы 4 раза
private void OnSizeChanged(object sender, SizeChangedEventArgs e)
{
if (_presenter == null) return;
var parent = _presenter.GetParentByType<ExpanderControl>();
var gt = parent.TransformToVisual(_presenter);
var childToParentCoordinates = gt.TransformPoint(new Point(0, 0));
_presenter.Width = parent.RenderSize.Width + childToParentCoordinates.X;
}
private void OnPresenterSizeChanged(object sender, SizeChangedEventArgs e)
{
if (null != _itemsCanvas && null != _presenter && IsExpanded)
{
_itemsCanvas.Height = _presenter.DesiredSize.Height;
}
}
В течение первых 2-х раз, _itemsCanvas имеет высоту 0. В то время как третий раз он имеет высоту 64, чтобы быть перезаписанным до 0 на четвертый раз.
Я не нашел причин, почему это происходит. Кто-нибудь здесь может помочь?
Не настоящий ответ, но я недавно использовал этот расширитель: https://github.com/deanchalk/ExpanderUWP (без каких-либо совпадений), и вот еще один https://github.com/JanJoris/Expander – Depechie