Mehrere Expander müssen Zusammenbruch, wenn ONE erweitert wird
Frage
Mit 4 Expander Kontrollen. Wenn ein Expander expandiert wie kann ich alle anderen Zusammenbruch / Schließen machen?
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).
ÜbereinstimmenXAML:
<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 Sie2) 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:
- hinzugefügt Stackpanel (Kind align wird vertikal eingestellt ist).
- hinzugefügt 3 Expander hinein. (Benötigt 3)
- Satzhöhe von Expandern auf 120px Elemente, um es hinzuzufügen.
- jeder Expander genannt ex1..3.
-
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; }
- Setzen Sie alle Expander, die Höhe zurück zu 23px bei Window_Loaded kollabiert werden soll.
, daß es.