代码之家  ›  专栏  ›  技术社区  ›  Andrew Lavers

动态调整打开的手风琴的大小

  •  9
  • Andrew Lavers  · 技术社区  · 16 年前

        <lt:Accordion Name="MyAccordion"
                      SelectionMode="ZeroOrOne"
                      HorizontalAlignment="Stretch">
            <lt:AccordionItem Name="MyAccordionItem"
                              Header="MyAccordion"
                              IsSelected="True"
                              HorizontalContentAlignment="Stretch"
                              VerticalAlignment="Stretch">
                <StackPanel>
                    <Button Content="Grow" Click="Grow"/>
                    <Button Content="Shrink" Click="Shrink"/>
                    <TextBox Name="GrowTextBox"
                             Text="GrowTextBox"
                             Height="400"
                             Background="Green"
                             SizeChanged="GrowTextBox_SizeChanged"/>
                </StackPanel>
            </lt:AccordionItem>
        </lt:Accordion>
    
    
        private void Grow(object sender, System.Windows.RoutedEventArgs e)
        {
            GrowTextBox.Height += 100;
        }
    
        private void Shrink(object sender, System.Windows.RoutedEventArgs e)
        {
            GrowTextBox.Height -= 100;
        }
    
        private void GrowTextBox_SizeChanged(object sender, System.Windows.SizeChangedEventArgs e)
        {
            MyAccordion.UpdateLayout();
            MyAccordionItem.UpdateLayout();
        }
    

    我试图通过添加一个SizeChanged事件处理程序来解决这个问题,该处理程序在Accordion和AccordionItem上调用UpdateLayout(),但这没有任何视觉效果。我搞不清楚在手风琴控制装置内哪里进行了适当的调整。有人有主意吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Bathineni    15 年前

    试试这个

     //here i am creating a size object depending on child items height and width
            // and 25 for accordian item header...
            // if it works you can easily update the following code to avoid exceptional behaviour
            Size size = new Size();
            size.Width = GrowTextBox.ActualWidth;
            size.Height = grow.ActualHeight + shrink.ActualHeight + GrowTextBox.ActualHeight + 25;
            MyAccordion.Arrange(new Rect(size));
    

    在上面的代码中,我只是根据子项大小重新排列accordion。

        2
  •  1
  •   Joshscorp    16 年前

    private void GrowTextBox_SizeChanged(object sender, System.Windows.SizeChangedEventArgs e)
    {
            MyAccordionItem.Measure(new Size());
            MyAccordionItem.UpdateLayout();
    }
    

    希望对你也有用。。

        3
  •  1
  •   Mike Fuchs Asif    13 年前

    我通过创建一个以SizeChanged开始的计时器来解决这个问题,该计时器取消选择并立即重新选择当前项,之后布局似乎被重新调整并显示正确。也许对你也有帮助。你可以省去计时器,我介绍它来防止连续调用时,用户拖动调整窗口的大小,它还提供了一种羽毛效果,因为延迟。

    public partial class MyAccordion : System.Windows.Controls.Accordion
    {
        private Timer _layoutUpdateTimer = new Timer(100);
    
        public MyAccordion
        {
            this.SizeChanged += (s, e) =>
            {
                _layoutUpdateTimer.Stop(); // prevents continuous calls
                _layoutUpdateTimer.Start();
            };
            _layoutUpdateTimer.Elapsed += (s, e) => ReselectItem();
        }
    
        private void ReselectItem()
        {
            Application.Current.Dispatcher.BeginInvoke((Action)(() =>
            {
                // backup values
                int selectedIndex = this.SelectedIndex;
                AccordionSelectionMode mode = this.SelectionMode;
    
                // deselect
                this.SelectionMode = AccordionSelectionMode.ZeroOrOne; // allow null selection
                this.SelectedItem = null;
    
                // restore values (reselect)
                this.SelectionMode = mode;
                this.SelectedIndex = selectedIndex;
            }));
            _layoutUpdateTimer.Stop();
        }
    }