题
具有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
如果存储的索引不匹配。
放入断点 Convert
和 ConvertBack
方法 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的答案对我非常有帮助 - 谢谢。
因此,如果有人需要,我想分享我的经验。
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的工作太多。这是我的做法:
- 添加了stackpanel(将儿童对齐设置为垂直)。
- 在其中添加了3个扩展程序。 (需要3)
- 将扩展器的高度设置为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_时的23px的扩展程序。
那。