2015-12-30 5 views
0

Ранее я портировал ExpanderView из набора инструментов Windows Phone в WinRT ExpanderRT, просто чтобы заметить, что если у вас есть два элемента управления ExpanderView внутри StackPanel или ListView, и вы хотите, чтобы первый расширительView расширялся с самого начала установив для свойства IsExpanded значение True, тогда первый expanderView будет накладывать второй.ExpanderView не будет расширяться изнутри XAML

Вот пример: -

<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

Не настоящий ответ, но я недавно использовал этот расширитель: https://github.com/deanchalk/ExpanderUWP (без каких-либо совпадений), и вот еще один https://github.com/JanJoris/Expander – Depechie

ответ

0

У меня возникли аналогичные проблемы после переноса Expander из набора инструментов для Windows.

Чтобы устранить эту проблему, я изменил 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 был вызван, довод содержимого был нулевым.

Смежные вопросы