具有4个扩展器控件。当一个扩展器扩展时,如何使所有其他膨胀/关闭?

有帮助吗?

解决方案

尝试以下代码:

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;
    }
}

ViewModel:

public class ExpanderListViewModel
{
    public Object SelectedExpander { get; set; }
}

初始化

StackPanel1.DataContext = new ExpanderListViewModel();

解释:

在XAML中,我们有4个扩展器。他们都继承了 ViewModel (类型 ExpanderListViewModel)来自容器 StackPanel 通过 DataContext.

它们都绑定到单个属性上的 ViewModel 班级。并已经为自己定义了独特的索引 ConverterParameter 在结合中。该索引被保存在 SelectedExpander 每当您扩展扩展膨胀机时的属性。并使用该索引, Converter 返回 true 如果存储的索引与给定索引匹配,并且 false 如果存储的索引不匹配。

放入断点 ConvertConvertBack 方法 Converter 上课,您将看到发生了什么。

其他提示

只是设定失去的焦点似乎是最简单的方法。

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

这就是我这样做的方式:

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上所有“扩展器”的打开/关闭,您只需要添加以下代码一次即可。

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,“ 2,expander”扩展了“不更新代码,其他事情都无法正常工作。

希望此信息对您有帮助。

发生了什么?

1)所有面板都是父母,该面板上的所有控件都是孩子,

2)所有控件都是家长面板的孩子。

3)一个课程一次打电话。

4)班级与孩子打交道。

6)班级搬到下一个孩子。

7)一旦所有孩子都被问到。

因此,伪代码就是这样:

1)听孩子叫X的孩子

2)在父母名单中询问每个孩子

3)如果孩子不打电话

4)儿童扩大是错误的

5)结束问孩子

6)搬到下一个孩子并再次询问

7)直到所有孩子都被问到

使用MVVM并将IS扩展的属性绑定到视图模型上的布尔标志。当一个更新到 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的答案对我非常有帮助 - 谢谢。
因此,如果有人需要,我想分享我的经验。

尝试从 WPF工具包 - 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>

我也需要这个,但是所有答案都是IMO的工作太多。这是我的做法:

  1. 添加了stackpanel(将儿童对齐设置为垂直)。
  2. 在其中添加了3个扩展程序。 (需要3)
  3. 将扩展器的高度设置为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_时的23px的扩展程序。

那。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top