Suchen

Suche

Aktuell

  • Aktuell
  • Kommentare
  • TagCloud
  • Bis jetzt sind noch keine Kommentare geschrieben worden
 .Net   Suche   ASP.Net   Asp.Net   Beta   Buchtipp   C#   CentOS   CoD   DateTime   DiceFight   Funktion   HTML   HowTo   HttpWebRequest   IIS7   JSON   Konfiguration   LCD   Lighttpd   Linux   Media   Microsoft   Mobile   Mono   MySQL   Oracle   Outlook   PHP   PostgreSQL   Programme   Quake3   RC   RealURL   SMTPE   SVN   Server   Snippet   TYPO3   Timeout   Treiber   Tutorial   USB   Vista   WebClient   Windows   bauer-martin.com   bm_chart   ffmpeg   x64 

Randnotiz

W3C

Valid XHTML Valid CSS

Tutorials, .Net - 10.11.2009 20:53 - Alter: 122 days
- Keine Kommentare

C#: WPF Accordion Usercontrol

Tags: C#, WPF, Accordion, Usercontrol

Im .net Framework wird leider kein fertiges Accordion Control für WPF mitgeliefert. Dies ist auch nicht weiter schlimm, den ein eigenes kann man sich sehr schnell selber zusammenbauen. Dazu nimmt man als Basis einfach ein StackPanel und fügt diesem als Inhalt Expander Controls hinzu.

public class Accordion : StackPanel
{
  static Accordion()
  {
    DefaultStyleKeyProperty.OverrideMetadata(typeof(Accordion), new FrameworkPropertyMetadata(typeof(Accordion)));
  }

  protected override void OnInitialized(System.EventArgs e)
  {
    base.OnInitialized(e);
    InitializeAccordion();
  }

  protected void InitializeAccordion()
  {
    Expander selectedExpander;
    foreach(UIElement element in Children)
    {
      selectedExpander = element as Expander;
      if(selectedExpander != null)
        selectedExpander.Expanded += SelectedExpanderExpanded;
    }
  }

  public void SelectedExpanderExpanded(object sender, RoutedEventArgs e)
  {
    Expander selectedExpander = sender as Expander;
    Expander otherExpander;
    ContentPresenter contentPresenter;
    double totalExpanderHeight = 0;

    if (selectedExpander == null)
      return;

    foreach(UIElement element in Children)
    {
      otherExpander = element as Expander;

      if (otherExpander == null || otherExpander == selectedExpander)
        continue;

      if(otherExpander.IsExpanded)
      {
        contentPresenter = otherExpander.Template.FindName("ExpandSite", otherExpander) as ContentPresenter;
        if (contentPresenter != null)
          totalExpanderHeight -= contentPresenter.ActualHeight;
      }

      otherExpander.IsExpanded = false;
      totalExpanderHeight += otherExpander.ActualHeight;
    }

    if(selectedExpander.IsExpanded)
    {
      contentPresenter = selectedExpander.Template.FindName("ExpandSite", selectedExpander) as ContentPresenter;
      if (contentPresenter != null)
        contentPresenter.Height = ActualHeight - totalExpanderHeight - selectedExpander.ActualHeight;
    }
  }
}

Im XAML-Code dann einfach das Accordion hinzufügen und als Children-Elemente Expander hinzufügen

<c:Accordion>
  <Expander Header="Inhalt #1">
    <Grid />
  </Expander>
  <Expander header="Inhalt #2">
    <Grid />
  </Expander>
</c:accordion>



Blink del.icio.us Digg Furl Google Simpy Spurl Technorati Yahoo

Kommentare

  • Bis jetzt sind noch keine Kommentare geschrieben worden

Kommentar schreiben

Ins Gästebuch eintragen
CAPTCHA Bild zum Spamschutz