如果ONE展开,则多个扩展器必须折叠

时间:2010-12-15 10:38:31

标签: wpf collapse expander

有4个Expander控件。当一个扩展器扩展时,我怎么能让所有其他扩展器崩溃/关闭?

7 个答案:

答案 0 :(得分:29)

尝试以下代码:

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个扩展器。它们都从容器ViewModelExpanderListViewModel继承了StackPanel(类型DataContext)。

它们都绑定到ViewModel类的单个属性。并且在绑定中使用ConverterParameter为自己定义了唯一索引。每当展开扩展器时,该索引都会保存在SelectedExpander属性中。如果存储的索引与给定的索引匹配,则Converter返回true,如果存储的索引不匹配,则返回false

Convert类的ConvertBackConverter方法中设置断点,您将看到发生了什么。

答案 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的太多工作。 我是这样做的:

  1. 添加了StackPanel(子对齐设置为垂直)。
  2. 在其中添加了3个扩展器。 (需要3)
  3. 将展开器的高度设置为120px以向其添加元素。
  4. 每个Expander都叫ex1..3。
  5. 每个人都有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;  
    }  
    
  6. 将所有应折叠高度的扩展器重置为window_loaded上的23px。
  7. 它。