我有一个带有一组扩展器的StackPanel,如何设置它以便任何时候只扩展扩展器?
干杯
AW
答案 0 :(得分:5)
我真的不想这样做,因为它需要将代码(C#)放在窗口后面的类文件中(我试图通过使用ViewModels等来完全避免这种情况)。
理想情况下,我会在XAML中对此进行描述。
我联系了我感兴趣的每个Expander'Expanded'事件并做了以下事情:
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;
}
}
干杯
AWC
答案 1 :(得分:1)
您可以添加一个依赖项属性,其值为“展开的扩展器”,然后您可以使用您喜欢的表达式绑定技术(类型转换器等)将“expanded”属性绑定到表达式“theExpandedProperty == this” )。
答案 2 :(得分:0)
这是一种更精细的方法,可以在WPF中完成,而不需要任何代码:
<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>
答案 3 :(得分:0)
用户“ Dabblernl”将其作为评论发布,但是它值得一个答案,因为它是一种完美的纯XAML解决方案,可很好地自定义并且没有任何黑客攻击。
这个想法是将Expander控件放置在ListBox中,并将Expander.IsExpanded
属性绑定到ListBoxItem.IsSelected
属性。
这是一个现成的示例,您可以将其粘贴到XAML文件中并进行尝试:
<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>
这里曾经是这里: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3061227&SiteID=1 但是forums.microsoft.com似乎已经破产了。
它仍然可以在此页面上找到: https://social.msdn.microsoft.com/Forums/en-US/a2988ae8-e7b8-4a62-a34f-b851aaf13886/windows-presentation-foundation-faq?forum=wpf 标题为“ 3.4如何在一组扩展器控件中仅使一个扩展器控件保持打开状态?”