J'ai un StackPanel avec un groupe d'extenseurs, comment puis-je la définir afin que seuls Expander soit élargi à la fois? P>
acclamations p>
aw p>
4 Réponses :
Vous pouvez ajouter une propriété de dépendance dont la valeur est "l'expandeur qui est élargie", puis vous pouvez lier la propriété "étendue" à l'expression "theexpandedproperty == ceci" à l'aide de votre technique de liaison d'expression préférée (convertisseur de type, etc. ). p>
Je ne voulais pas vraiment le faire comme ceci, car il avait besoin de mettre le code (C #) dans la classe derrière le fichier de la fenêtre (j'essaie d'éviter cela complètement en utilisant des images de vue, etc.).
Idéalement, j'aurais décrit cela dans xaml. P>
J'ai raccroché à chaque événement "élargi" de l'extenseur, j'étais intéressé et j'ai fait ce qui suit: p>
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; } }
Donc, c'est ainsi que vous le feriez dans un cadre de la vieille école comme Winforms. Ce n'est pas "la WPF Way", cependant, car pour que WPF soit entièrement robuste, vous souhaitez dériver de l'état des données, pas des événements.
Je me rends compte, d'où mes commentaires, mais je suis content de cela dans le code derrière
Oui, vous pouvez toujours le mettre dans une liste de liste - BOOOO --- Votre chemin est beaucoup mieux - ce n'est pas la voie du WPF, mais non. Cela ne va pas de faire en sorte que le WPF Way n'est pas correct non plus! social.msdn.microsoft.com/forums/vstudio/en-us/...
Voici un moyen plus élaboré de le faire dans WPF sans aucun code derrière:
<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>
Utilisateur "dabblernl" posté ceci comme un commentaire, mais il mérite d'être une réponse car il s'agit d'une solution parfaite XAML uniquement, joliment personnalisable et sans piratage.
L'idée est de placer les contrôles de l'expandeur dans une liste, et lier la propriété Voici un exemple de prêt que vous pouvez simplement coller dans un XAML Fichier et essayez-le: P> extander.iseexpanded code> dans la propriété
listboxItem.isselected code> Propriété. P>
<ListBox>
<ListBox.Resources>
<Style TargetType="{x:Type Expander}">
<Setter Property="IsExpanded" Value="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" />
</Style>
</ListBox.Resources>
<ListBox.Template>
<ControlTemplate TargetType="{x:Type ListBox}">
<ItemsPresenter />
</ControlTemplate>
</ListBox.Template>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<ContentPresenter Content="{TemplateBinding Content}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<Expander Background="Gray" Width="243" Header="Expander1">
<StackPanel>
<RadioButton Content="Eat Me" GroupName="Two" />
<RadioButton Content="Eat Pork" GroupName="Two" />
<RadioButton Content="Eat at Joe's" GroupName="Two" />
</StackPanel>
</Expander>
<Expander Background="Gray" Width="243" Header="Expander2">
<StackPanel>
<RadioButton Content="Pork" GroupName="Two" />
<RadioButton Content="Beef" GroupName="Two" />
<RadioButton Content="Chicken" GroupName="Two" />
</StackPanel>
</Expander>
<Expander Background="Gray" Width="243" Header="Expander3">
<StackPanel>
<RadioButton Content="Grill" GroupName="Two" />
<RadioButton Content="Bake" GroupName="Two" />
<RadioButton Content="Fry" GroupName="Two" />
</StackPanel>
</Expander>
</ListBox>
J'ai trouvé une implémentation élégante et XAML uniquement de cette exigence. Cliquez sur ici! A >
404 - Fichier ou répertoire introuvable. forums.msdn.microsoft. com / fr-nous / wpf / thread / ...
en xaml Stackoverflow.com/questions/897146/...