0

以前我将 ExpanderView 从 Windows Phone 工具包移植到 WinRT ExpanderRT,现在只是要注意,如果您在 StackPanel 或 ListView 中有两个 ExpanderView 控件,并且您希望通过将 IsExpanded 属性设置为 True 来从头开始展开第一个 expanderView,那么首先expanderView 将覆盖第二个。

这是一个例子:-

<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。

我还没有找到发生这种情况的任何原因。这里有人可以帮忙吗?

4

1 回答 1

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 时,内容 presnter 为空。

于 2016-01-08T17:41:45.393 回答