【问题标题】:ExpanderView will not expand from inside XAMLExpanderView 不会从 XAML 内部展开
【发布时间】:2015-12-30 03:55:09
【问题描述】:

之前我将 ExpanderView 从 Windows Phone 工具包移植到 WinRT ExpanderRT,现在请注意,如果您在 StackPanel 或 ListView 中有两个 ExpanderView 控件,并且您希望通过设置 IsExpanded 属性从头开始展开第一个 expanderView为 True,则第一个 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。

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

【问题讨论】:

标签: xaml uwp windows-phone-toolkit


【解决方案1】:

从 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 为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2020-09-20
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多