2009-12-17 8 views
8

Ich habe ein StackPanel mit einer Gruppe von Expandern, wie stelle ich es ein, so dass nur der Expander zu jeder Zeit erweitert wird?WPF - Wie bekomme ich immer nur einen Expander?

Prost

AW

+0

Ich fand eine elegante, nur XAML-Implementierung dieser Anforderung. Klicken Sie [hier!] (Http://social.msdn.microsoft.com/forums/en-US/wpf/thread/a2988ae8-e7b8-4a62-a34f-b851aaf13886) – Dabblernl

+0

404 - Datei oder Verzeichnis nicht gefunden. http://forums.msdn.microsoft.com/en-US/wpf/thread/a2988ae8-e7b8-4a62-a34f-b851aaf13886#expander_list – schmoopy

+0

in XAML https://stackoverflow.com/questions/897146/making -a-collection-of-wpf-expander-expand-exclusive-dh-nur-1-expande –

Antwort

5

Ich wollte es nicht wirklich so machen, da Code (C#) in die Klasse hinter der Datei für das Fenster geschrieben werden musste (ich versuche das durch ViewModels usw. vollständig zu vermeiden).

Idealerweise hätte ich dies in XAML beschrieben.

hakte ich jeden Expander 'Expanded' Veranstaltung up Ich war interessiert und hat die folgenden:

private void HandleExpanderExpanded(object sender, RoutedEventArgs e) 
    { 
     ExpandExculsively(sender as Expander); 
    } 

    private void ExpandExculsively(Expander expander) 
    { 
     foreach (var child in findPanel.Children) 
     { 
      if (child is Expander && child != expander) 
       ((Expander)child).IsExpanded = false; 
     } 
    } 

Prost

AWC

+0

So, so würden Sie es in einem Old-School-Framework wie WinForms tun. Es ist jedoch nicht "der WPF-Weg", denn damit WPF vollständig robust ist, möchten Sie den Zustand aus Daten und nicht aus Ereignissen ableiten. –

+1

Ich realisiere das, daher meine Kommentare, aber ich bin zufrieden mit dem Code hinter – AwkwardCoder

+1

Ja, du kannst es immer in eine Listbox setzen - boooo --- dein Weg ist VIEL BESSER - es ist nicht der WPF-Weg aber .. macht es falsch, es zu machen, ist der WPF-Weg auch nicht richtig! https://social.msdn.microsoft.com/Forums/vstudio/en-US/a2988ae8-e7b8-4a62-a34f-b851aaf13886/windows-presentation-foundation-faq?forum=wpf#expander_list – schmoopy

1

Sie können eine Abhängigkeitseigenschaft, deren Wert hinzufügen „der Expander, die erweitert wird“, und dann können Sie die „erweiterte“ Eigenschaft auf den Ausdruck „theExpandedProperty == dieses“ binden Verwenden Sie Ihre Lieblings-Ausdruck-Bindungs-Technik (Typ Konverter, etc).

0

Hier ist ein aufwendiger Weg, um es in WPF zu tun ohne Code hinten:

<UserControl.Resources> 
    <ResourceDictionary> 
     ... 
     <Style TargetType="{x:Type Expander}"> 
      <Setter Property="IsExpanded" Value="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}"/> 
     </Style> 

    </ResourceDictionary> 

</UserControl.Resources> 

<Grid x:Name="LayoutRoot" Background="{x:Null}" Margin="10"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <ScrollViewer VerticalAlignment="Top" HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Auto" VerticalContentAlignment="Top" BorderThickness="0,0,0,0" Grid.RowSpan="1" Grid.Row="0"> 
     <ListBox x:Name="OrdersListBox" BorderThickness="0" ItemContainerStyle="{StaticResource ShellThemeListBoxStyle}" 
       IsSynchronizedWithCurrentItem="True" 
       prism:RegionManager.RegionName="{x:Static uiCommon:RegionNames.WorkSheetsRegion}" Background="#00000000"> 
      <ListBox.ItemTemplate> 
       <DataTemplate DataType="typeData:WorkSheetsDetialsViewModel"> 
        <local:WorkSheetsDetialsView/> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </ScrollViewer> 
    ... 
</Grid> 

<UserControl 
    x:Class="Module.ExcelDocumentManager.WorkSheets.WorkSheetsDetialsView" 
    ...> 
    <Expander> 
     <Expander.Header> 
      <TextBlock Text="{Binding HeaderInfo}" RenderTransformOrigin=".5,.5"> 
      </TextBlock> 
     </Expander.Header> 
     ... 

    </Expander> 
</UserControl> 
Verwandte Themen