WPF扩展器模板 - 在ToggleButton上方显示内容

时间:2016-01-19 14:45:44

标签: c# wpf xaml togglebutton expander

我即将创建一个新的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不再可见)。

我做错了什么?

此外,我对此问题有一些疑问:

  1. &#34; ContentSource =&#34;内容&#34;&#34;做?它是为了什么?什么不同于&#34;内容=&#34; {模板绑定内容}&#34;&#34;?
  2. 扩展器的属性&#34; IsExpanded&#34;当ToggleButtons属性&#34; IsPressed&#34;改变了吗?如果扩展器中根本没有Togglebutton会怎么样?

1 个答案:

答案 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”属性。 如果您要取出按钮,扩展器将无法工作,直到您创建一个绑定或在代码中发出指令来告诉它打开/关闭。

相关问题