Frage

Mit 4 Expander Kontrollen. Wenn ein Expander expandiert wie kann ich alle anderen Zusammenbruch / Schließen machen?

War es hilfreich?

Lösung

Versuchen Sie folgenden Code ein:

XAML:

        <StackPanel Name="StackPanel1">
            <StackPanel.Resources>
                <local:ExpanderToBooleanConverter x:Key="ExpanderToBooleanConverter" />
            </StackPanel.Resources>
            <Expander Header="Expander 1"
                      IsExpanded="{Binding SelectedExpander, Mode=TwoWay, Converter={StaticResource ExpanderToBooleanConverter}, ConverterParameter=1}">
                <TextBlock>Expander 1</TextBlock>
            </Expander>
            <Expander Header="Expander 2"
                      IsExpanded="{Binding SelectedExpander, Mode=TwoWay, Converter={StaticResource ExpanderToBooleanConverter}, ConverterParameter=2}">
                <TextBlock>Expander 2</TextBlock>
            </Expander>
            <Expander Header="Expander 3"
                      IsExpanded="{Binding SelectedExpander, Mode=TwoWay, Converter={StaticResource ExpanderToBooleanConverter}, ConverterParameter=3}">
                <TextBlock>Expander 3</TextBlock>
            </Expander>
            <Expander Header="Expander 4"
                      IsExpanded="{Binding SelectedExpander, Mode=TwoWay, Converter={StaticResource ExpanderToBooleanConverter}, ConverterParameter=4}">
                <TextBlock>Expander 4</TextBlock>
            </Expander>
        </StackPanel>

Converter:

public class ExpanderToBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (value == parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (System.Convert.ToBoolean(value)) return parameter;
        return null;
    }
}

Ansichtsmodell:

public class ExpanderListViewModel
{
    public Object SelectedExpander { get; set; }
}

Initialisierung

StackPanel1.DataContext = new ExpanderListViewModel();

Erklärung:

In XAML haben wir 4 Expander. Sie alle erben einen ViewModel (vom Typ ExpanderListViewModel) aus dem Behälter StackPanel durch DataContext.

Sie alle binden an einzelne Eigenschaft auf ViewModel Klasse. Und haben einen eindeutigen Index definiert für sich ConverterParameter mit der Bindung. Dieser Index wird in SelectedExpander Eigenschaft gespeichert, wenn Sie einen Expander erweitern. Und diesen Index verwenden, die Converter kehrt true, wenn die gespeicherten Indexübereinstimmungen mit bestimmten Index und false wenn gespeicherten Index nicht übereinstimmt.

Setzen Sie einen Haltepunkt in Convert und ConvertBack Methoden der Converter Klasse und Sie werden sehen, was los ist.

Andere Tipps

Sie einfach den Fokus verliert Einstellung scheint der einfachste Weg, dies zu tun.

XAML:

<Expander LostFocus="CollapseExpander" ExpandDirection="Down" Width="175">
    <ListBox Height="265" Margin="0,5,0,10">
    </ListBox>
</Expander>

VB:

Private Sub CollapseExpander(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)

 sender.IsExpanded = False

End Sub

Dies ist, wie ich es getan hätte:

1) ein Stackpanel hinzugefügt und muss ein Namensschild Attribut hinzufügen (wie dies der Master ist).

Stackpanel Name = "StackPanel1"

2) Fügen Sie so viele Expanders, wie Sie benötigen (1 bis 100 ist, wenn erforderlich) jeweils MÜSSEN: -

Expanded = "Expander_Expanded"

hinzugefügt (Bekanntmachung alle 100% haben die gleiche Formulierung).

3) keine weiteren Details müssen auf jedem (keine Höhen Der Namen etc .. erforderlich).

Übereinstimmen

XAML:

<StackPanel Name="StackPanel1">
<Expander Header="Expander 1" Expanded="Expander_Expanded">
    <TextBlock>Expander 1</TextBlock>
</Expander>
<Expander Header="Expander 2" Expanded="Expander_Expanded">
    <TextBlock>Expander 2</TextBlock>
</Expander>
<Expander Header="Expander 3" Expanded="Expander_Expanded" >
    <TextBlock>Expander 3</TextBlock>
</Expander>
<Expander Header="Expander 4" Expanded="Expander_Expanded" >
    <TextBlock>Expander 4</TextBlock>
</Expander>

4) Zur Steuerung des Öffnen / Schließen aller „Expanders“ auf dem Namen „StackPanel1“ Stackpanel Sie brauchen nur einmal die folgenden Code hinzuzufügen.

VB-Code-behind:

Private Sub Expander_Expanded(sender As Object, e As RoutedEventArgs)
    For Each exp As Expander In StackPanel1.Children
        If exp IsNot sender Then
            exp.IsExpanded = False
        End If
    Next
End Sub

5) Jetzt können Sie ändern / welche Inhalte, Schaltfläche, Textbox des etc .. Sie benötigen nur 2 Dinge nicht ändern 1 „Stackpanel-Name“ 2 „Expander Erweitert“ ohne Aktualisierung der Code-behind sonst die Dinge nicht Arbeit.

Hope diese Informationen hilfreich für Sie.

Was ist los?

1) Alle Panels sind Eltern und alle Bedienelemente auf dieser Platte sind Kinder,

2) Alle Bedienelemente sind Kinder eines Elternteils Panel.

3) eine Klasse beschäftigt sich mit einem Aufruf zu einem Zeitpunkt.

4) Die Klasse beschäftigt sich mit Kind.

6) Die Klasse Bewegung zum nächsten Kind.

7) Stops einmal alle Kinder wurden gebeten.

So ist der Pseudo-Code ist wie folgt:

1) Hören für ein Kind namens x

Stellen Sie

2) jedes Kind im Eltern Liste der Kinder

3) Wenn das Kind nicht dann ruft

4) Kinder erweitert wird, ist falsch

5) Ende dieses Kind zu fragen

6) Zum nächsten Kind und fragt wieder

7), bis alle Kinder werden gebeten,

Verwenden Sie MVVM und binden die IsExpanded Eigenschaft auf eine boolean-Flag auf Ihrer Ansicht Modelle. Wenn man zu true aktualisiert wird, setzen alle anderen false.

@ wassim-azirar auf die akzeptierte Antwort gefragt:

Wie kann ich erweitern 'Expander 1' bei der Anwendung Startup?

ich im Ansichtsmodell hinzugefügt:

SelectedExpander = "1";

Aufgrund der Tatsache, dass die „1“ ist nicht das gleiche Objekt wie die „1“ in XAML das wird nicht funktionieren, so dass ich decyclone Antwort wie folgt geändert:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    return (string)value == (string)parameter;
}

Die Antwort von decyclone war sehr hilfreich für mich - Danke
. So möchte ich meine Erfahrung teilen, wenn jemand sie braucht.

Versuchen Sie, die Akkordeon-Steuerung von WPF Toolkit - Februar 2010 #

http://www.dotnetspark.com/kb/ 1931-Akkordeon-wpf-Toolkit-tutorial.aspx

Beispielcode:

<my:Accordion  x:Name="accordion1" VerticalAlignment="Top" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" SelectionMode="ZeroOrOne">
        <my:AccordionItem Header="First Header" Content="First Content"/>
        <my:AccordionItem Header="Second Header">
            <StackPanel Height="300">
            <TextBlock Text="Second Content" /></StackPanel>
        </my:AccordionItem>
        <my:AccordionItem>
            <my:AccordionItem.Header>
                <TextBox Text="Third Item" />
            </my:AccordionItem.Header>
            <StackPanel Height="300">
                <TextBlock Text="Third Item" />
            </StackPanel>
        </my:AccordionItem>
        <my:AccordionItem>
            <my:AccordionItem.Header>
                <TextBlock Text="Fourth Item" />
            </my:AccordionItem.Header>
            <StackPanel Height="300">
                <TextBlock Text="Third Item" />
            </StackPanel>
        </my:AccordionItem>
    </my:Accordion>

Ich musste auch das, aber alle Antworten war zu viel Arbeit IMO. Hier ist, wie ich es getan hätte:

  1. hinzugefügt Stackpanel (Kind align wird vertikal eingestellt ist).
  2. hinzugefügt 3 Expander hinein. (Benötigt 3)
  3. Satzhöhe von Expandern auf 120px Elemente, um es hinzuzufügen.
  4. jeder Expander genannt ex1..3.
  5. Jeder bekam zwei Ereignisse

    private void ex1_Collapsed(object sender, RoutedEventArgs e)  
    {  
        ex1.Height = 23.0;  
    }  
    
    private void ex1_Expanded(object sender, RoutedEventArgs e)    
    {  
        ex1.Height = 120.0;  
        ex2.IsExpanded = false;  
        ex3.IsExpanded = false;  
    }  
    
  6. Setzen Sie alle Expander, die Höhe zurück zu 23px bei Window_Loaded kollabiert werden soll.

, daß es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top