有 4 个扩展器控件。当一个扩展器被扩展时,我怎样才能让所有其他扩展器折叠/关闭?
7 回答
试试下面的代码:
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>
转换器:
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;
}
}
视图模型:
public class ExpanderListViewModel
{
public Object SelectedExpander { get; set; }
}
初始化
StackPanel1.DataContext = new ExpanderListViewModel();
解释:
在 XAML 中,我们有 4 个扩展器。它们都从容器继承了一个ViewModel
(类型)到.ExpanderListViewModel
StackPanel
DataContext
它们都绑定到ViewModel
类上的单个属性。ConverterParameter
并使用in binding为自己定义了一个唯一索引。SelectedExpander
每当您展开扩展器时,该索引都会保存在属性中。并且使用该索引,如果存储的索引与给定的索引匹配并且存储的索引不匹配,则Converter
返回。true
false
Convert
在类和ConvertBack
方法中放置一个断点,Converter
您将看到发生了什么。
我就是这样做的:
1)添加了一个 StackPanel 并且必须添加一个名称标签属性(因为这是主服务器)。
StackPanel 名称="StackPanel1"
2)根据需要添加任意数量的扩展器(如果需要,可以添加 1 到 100 个)每个必须具有:-
Expanded="Expander_Expanded"
添加(注意所有的措辞都 100% 相同)。
3)每个细节都不需要匹配(不需要高度的名称等)。
xml:
<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) 要控制名为“StackPanel1”StackPanel 上所有“扩展器”的打开/关闭,您只需添加以下代码一次。
VB代码隐藏:
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)现在您可以更改/添加什么内容、按钮、文本框等。您只需要不更改 2 件事 1、“StackPanel 名称”2、“Expander Expanded”而不更新代码隐藏,否则将无法正常工作。
希望这些信息对您有所帮助。
发生了什么?
1)所有面板都是父母,该面板上的所有控件都是孩子,
2) 所有控件都是父面板的子项。
3) 一个类一次处理一个调用。
4) 班级与孩子打交道。
6) 班级转移到下一个孩子。
7) 询问完所有孩子后停止。
所以伪代码是这样的:
1) 听一个孩子的名字 x
2)询问父母孩子名单中的每个孩子
3)如果孩子没有打电话,那么
4)孩子被扩大是假的
5)结束询问那个孩子
6)移动到下一个孩子并再次询问
7) 直到所有孩子都被问到
只是设置丢失的焦点似乎是最简单的方法。
xml:
<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
使用 MVVM 并将 IsExpanded 属性绑定到视图模型上的布尔标志。当一个更新为 时true
,将所有其他设置为false
。
@wassim-azirar 询问接受的答案:
如何在应用程序启动时扩展“扩展器 1”?
我在 ViewModel 中添加:
SelectedExpander = "1";
因为事实上,“1”与 XAML 中的“1”不是同一个对象,所以这不起作用,所以我改变了 decyclone 的答案,如下所示:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (string)value == (string)parameter;
}
decyclone 的回答对我很有帮助 - 谢谢。
因此,如果有人需要,我想分享我的经验。
我也需要这个,但所有的答案都是海事组织的工作量太大。这是我的做法:
- 添加了 StackPanel(子对齐设置为垂直)。
- 在其中添加了 3 个扩展器。(需要 3 个)
- 将 Expanders 的高度设置为 120px 以向其中添加元素。
- 每个扩展器都称为 ex1..3。
每个人都有 2 个事件
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; }
- 在 window_loaded 处将所有应折叠高度的扩展器重置为 23 像素。
那它。
尝试WPF Toolkit中的 Accordion 控件- 2010 年 2 月版
http://www.dotnetspark.com/kb/1931-accordion-wpf-toolkit-tutorial.aspx
示例代码:
<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>