有4个Expander控件。当一个扩展器扩展时,我怎么能让所有其他扩展器崩溃/关闭?
答案 0 :(得分:29)
尝试以下代码:
<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
为自己定义了唯一索引。每当展开扩展器时,该索引都会保存在SelectedExpander
属性中。如果存储的索引与给定的索引匹配,则Converter
返回true
,如果存储的索引不匹配,则返回false
。
在Convert
类的ConvertBack
和Converter
方法中设置断点,您将看到发生了什么。
答案 1 :(得分:3)
设置迷失焦点似乎是最简单的方法。
的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
答案 2 :(得分:1)
使用MVVM并将IsExpanded属性绑定到视图模型上的布尔标志。当其中一个更新为true
时,请将所有其他人设置为false
。
答案 3 :(得分:1)
这就是我做到的:
1)添加了一个StackPanel并且必须添加一个名称标签属性(因为这是主人)。
StackPanel Name =“StackPanel1”
2)根据需要添加尽可能多的扩展器(如果需要,可添加1到100个): -
扩展= “Expander_Expanded”
添加(注意所有都有100%相同的措辞)。
3)没有其他细节需要在每个细节上匹配(没有高度的名称等......需要)。
的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)要控制命名的“StackPanel1”StackPanel上所有“Expanders”的打开/关闭,您只需要添加以下代码一次。
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 Name”2,“Expander Expanded”而不更新代码 - 其他东西不会工作
希望这些信息对您有所帮助。
发生了什么事?
1)所有面板都是父母,该面板上的所有控件都是儿童,
2)所有控件都是父面板的子项。
3)课程一次处理一个电话。
4)课程涉及孩子。
6)班级转移到下一个孩子。
7)一旦被问到所有孩子,就停止了。
所以伪代码是这样的:
1)听一个名为x的孩子
2)询问每个孩子父母的孩子名单
3)如果孩子没有打电话那么
4)儿童被扩大是假的
5)结束询问孩子
6)转移到下一个孩子并再次询问
7)直到所有的孩子都被问到
答案 4 :(得分:1)
@ wassim-azirar问了接受的答案:
如何扩展&#39; Expander 1&#39;在应用程序启动?
我在ViewModel中添加了:
SelectedExpander = "1";
因为事实,&#34; 1&#34;与&#34; 1&#34;不是同一个对象。在XAML中这不起作用,所以我改变了decyclone的答案:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (string)value == (string)parameter;
}
decyclone的答案对我非常有帮助 - 谢谢 所以如果有人需要,我想分享我的经验。
答案 5 :(得分:0)
从WPF Toolkit - February 2010 Release
尝试手风琴控制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>
答案 6 :(得分:0)
我也需要这个,但所有答案都是IMO的太多工作。 我是这样做的:
每个人都有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;
}
它。