0

以前、ExpanderView を Windows Phone ツールキットから WinRT ExpanderRTに移植しましたが、StackPanel または ListView 内に 2 つの ExpanderView コントロールがあり、IsExpanded プロパティを True に設定して最初の expanderView を最初から展開したい場合は、最初にexpanderView は 2 番目のものをオーバーレイします。

ここに例があります: -

<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 です。3 回目の高さは 64 で、4 回目までに 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 が初めて呼び出されたときに、コンテンツ プレゼンターが null だったことです。

于 2016-01-08T17:41:45.393 に答える