我即将创建一个新的Expander Control(学习目的),创建不同的模板,但无法弄清楚我做错了什么......
ToggleButtonTemplate:
<Expander>
<Expander.Template>
<ControlTemplate TargetType="Expander">
<Grid>
<Grid.RowDefinitions>
<RowDefinition x:Name="ContentRow" Height="*"/>
<RowDefinition Height="20"/>
</Grid.RowDefinitions>
<ContentPresenter Grid.Row="0" Visibility="Collapsed" Content="{TemplateBinding Content}"/>
<local:FullSizeExpanderToggleButton Grid.Row="1" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="True">
<Setter Property="Visibility" Value="Visible"/>
<Setter Property="Height" Value="*" TargetName="ContentRow"/>
</Trigger>
<Trigger Property="IsExpanded" Value="False">
<Setter Property="Height" Value="0" TargetName="ContentRow"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Expander.Template>
</Expander>
Expander Template:
<custom:FullSizeExpander Width="300">
<Button/>
</custom:FullSizeExpander>
现在我想在主视图中添加Expander:
vars = hello world
something:
echo $(VAR)
something-all:
$(foreach i, $(vars), $(MAKE) something VAR=$i || exit 1;)
Control中的整个空间被Button填充(ToggleButton不再可见)。
我做错了什么?
此外,我对此问题有一些疑问:
答案 0 :(得分:1)
首先,考虑将Expander模板修改为如下所示:
<Expander>
<Rectangle Height="500" Width="500" Fill="Red"/>
<Expander.Template>
<ControlTemplate TargetType="Expander">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="20"/>
</Grid.RowDefinitions>
<ContentPresenter Grid.Row="0" x:Name="ContentPresenter"/>
<ToggleButton Grid.Row="1" IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsExpanded}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="True">
<Setter TargetName="ContentPresenter" Property="Visibility" Value="Visible"/>
</Trigger>
<Trigger Property="IsExpanded" Value="False">
<Setter TargetName="ContentPresenter" Property="Visibility" Value="Collapsed"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Expander.Template>
</Expander>
我将解释它是如何工作的,以及为什么它在自上而下之前没有工作。 首先,你会想要在扩展器中放置一些东西以确保它正常工作 - 我现在在这里放一个固定尺寸的矩形。
接下来,我将第一个RowDefinition更改为auto而不是*,因为您希望扩展器在打开时实际扩展。 (而不是仅仅将其内容隐藏在一个很大的空白区域)。自动使用与行中所需内容一样多的空间,因此当它折叠时,该大小将为0,当它展开时,auto将变为500以适合矩形。
我做的第三件事是从ContentPresenter中删除你的绑定。碰巧的是,Windows的内容承载模板(就像在其中放置了其他内容的任何内容一样)将自动在其模板中查找第一个ContentPresenter / ItemsPresenter标记并将内容推送到其中。
至于togglebutton然而(我保持简单并将其作为标准togglebutton),这个确实需要一个绑定。 我所做的是属性“IsExpanded”属性的相对源模板绑定。 Togglebuttons有两个主要状态:“Checked”和“Unchecked”(真/假),Expanders有两个主要状态:“Expanded”和“Collapsed”(真/假)。 所以我基本上所做的就是告诉ToggleButton与它所在的父级共享其被检查或未选中的真/假状态。
完全绑定再次是"{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsChecked}"
,在英语中基本上是说“绑定到相关的源,相关的源是你在模板中的父级,并绑定到所述模板; s “IsChecked”财产。
最后,我改变了你的触发器,这些触发器已经很长时间以使ContentPresenter变得隐藏(试图通过减小Grid.Row它的大小来压缩它),而只是告诉它隐藏时expandder的“IsExpanded”(由于我们的绑定,ToggleButton的“IsChecked”)被设置为false,而当它们被设置为true时则相反。
至于你的其他问题: 1)ContentSource用于为ContentPresenter提供别名/替代名称,我怀疑你很快就会需要它。属性名称有点误导,我授予你。
2)正如我们在上面看到的那样,没有 - 为了工作,需要将ToggleButton绑定到模板化父级的“IsExpanded”属性。 如果您要取出按钮,扩展器将无法工作,直到您创建一个绑定或在代码中发出指令来告诉它打开/关闭。