ExpanderView不会从XAML内部扩展

时间:2015-12-30 03:55:10

标签: xaml uwp windows-phone-toolkit

之前我将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。

我没有找到任何理由发生这种情况。这里有人可以帮忙吗?

1 个答案:

答案 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时,内容预设器为空。