2010-05-12 21 views
9

我有一个Accordion,其内容的高度可以动态调整大小。我希望手风琴能够动态响应儿童项目的高度,但我很难做到这一点。动态调整打开的手风琴的大小

<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(); 
    } 

你要知道,如果我崩溃,然后重新打开手风琴,它需要的形状只是我想要的方式,但我想,当孩子调整大小以立即发生这种大小调整。

我无力地尝试通过添加一个调用Accordion和AccordionItem的UpdateLayout()的SizeChanged事件处理程序来解决此问题,但这没有任何视觉效果。我无法弄清楚在Accordion控件中适当调整大小的位置。有人有想法吗?

回答

1

试试这个

//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)); 

在上面的代码中,我只是根据子项大小重新安排手风琴。

1

我有类似的问题,我简单的黑客如下:

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

希望它为你工作太..

干杯

+0

嗯,这听起来很有希望,但它似乎并没有解决问题。我可以看到你的XAML是什么样的吗? – 2010-05-14 23:04:22

+0

我有一个datagrid内的数据网格,并在内部网格的sizechanged,我包括代码如上。让我试试按钮,然后回到你身边。 – Joshscorp 2010-05-18 00:49:29

1

我有一个稍微不同的问题 - 调整窗口大小有时并未正确调整Accordion项目大小,因此下一个项目的标题将卡在窗口下方或中间。

我通过创建一个在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(); 
    } 
}