之前我将ExpanderView从Windows Phone工具包移植到WinRT ExpanderRT,现在注意到如果在StackPanel或ListView中有两个ExpanderView控件,并且您希望通过设置第一个expandderView从头开始扩展IsExpanded属性为True,然后第一个expandderView将覆盖第二个。
以下是一个例子: -
<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。
我没有找到任何理由发生这种情况。这里有人可以帮忙吗?
答案 0 :(得分:0)
从Windows phone工具包移植Expander后,我遇到了类似的问题。
要解决此问题,我修改了OnPresenterSizeChanged逻辑
private void OnPresenterSizeChanged(object sender, SizeChangedEventArgs e)
{
if (null != _itemsCanvas && null != _presenter && IsExpanded)
{
if (double.IsNaN(_itemsCanvas.Height))
{
VisualStateManager.GoToState(this, CollapsedState, false);
UpdateVisualState(true);
}
else
{
// Already expanded, so we need to update the height of the canvas directly.
_itemsCanvas.Height = _presenter.DesiredSize.Height;
}
}
}
这里的不同之处在于我检查项目画布之前是否已经渲染,而不是基于检查它的高度是否为Nan,如果是这种情况,那么我将视觉状态更改为折叠而不进行转换然后我调用UpdateVisualState(true) 。否则我只是更新画布的渲染高度。
问题是第一次调用UpdateVisualState时,内容预设器为空。