12

有 4 个扩展器控件。当一个扩展器被扩展时,我怎样才能让所有其他扩展器折叠/关闭?

4

7 回答 7

33

试试下面的代码:

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(类型)到.ExpanderListViewModelStackPanelDataContext

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

Convert在类和ConvertBack方法中放置一个断点,Converter您将看到发生了什么。

于 2010-12-15T11:22:55.000 回答
4

我就是这样做的:

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) 直到所有孩子都被问到

于 2015-02-14T14:19:34.973 回答
3

只是设置丢失的焦点似乎是最简单的方法。

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
于 2011-10-14T01:53:56.010 回答
1

使用 MVVM 并将 IsExpanded 属性绑定到视图模型上的布尔标志。当一个更新为 时true,将所有其他设置为false

于 2010-12-15T10:41:57.127 回答
1

@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 的回答对我很有帮助 - 谢谢。
因此,如果有人需要,我想分享我的经验。

于 2016-07-20T09:10:26.357 回答
0

我也需要这个,但所有的答案都是海事组织的工作量太大。这是我的做法:

  1. 添加了 StackPanel(子对齐设置为垂直)。
  2. 在其中添加了 3 个扩展器。(需要 3 个)
  3. 将 Expanders 的高度设置为 120px 以向其中添加元素。
  4. 每个扩展器都称为 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 处将所有应折叠高度的扩展器重置为 23 像素。

那它。

于 2014-10-06T00:03:50.983 回答
0

尝试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>
于 2010-12-15T11:28:04.730 回答