需要一些关于如何引用外部控制的建议

时间:2014-08-12 01:37:31

标签: wpf xaml

我将一个Tabcontrol插入BorderControl。 Tabcontrol使用了单独的样式。现在Tabcontrol里面的关闭按钮可以引用它自己。因此,当点击它时,TabControl已关闭 我想是 。是否可以将按钮引用到外部的边框控件,以便在关闭时控制边框控件?

<DockPanel LastChildFill="True">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="160" MinWidth="100"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Border Margin="5,5,0,5" BorderBrush="Aqua" BorderThickness="1">
            <TabControl Margin="0,15,0,0" Style="{StaticResource StandardTabControl}" >
                <TabItem Header="Start">
                </TabItem>
            </TabControl>
        </Border>
        <GridSplitter Grid.Column="1" Background="Transparent" Width="6" HorizontalAlignment="Center"></GridSplitter>
        <Border Grid.Column="2" BorderBrush="Aqua" BorderThickness="1" Margin="0,5,5,5"></Border>
    </Grid>

</DockPanel>

enter image description here

点击关闭按钮后

After click the close button

TabControl的部分样式。

<Button Grid.Column="1" Height="15" Width="15" HorizontalAlignment="Center" VerticalAlignment="Center">
<i:Interaction.Triggers>
    <i:EventTrigger EventName="Click">
     <Ac:CloseTabItemAction TabItem="{Binding RelativeSource={RelativeSource AncestorType=TabItem}}" 
                            TabControl="{Binding RelativeSource={RelativeSource AncestorType=TabControl}}">                                               
     </Ac:CloseTabItemAction>
</i:EventTrigger>
</i:Interaction.Triggers>
<!--A lot more about styles-->
</Button>

1 个答案:

答案 0 :(得分:1)

这是一个在纯xaml中使用控制模板触发器的解决方案

<DockPanel LastChildFill="True">
    <Control>
        <Control.Template>
            <ControlTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="160"
                                          MinWidth="100"
                                          x:Name="column" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <Border Margin="5,5,0,5"
                            BorderBrush="Aqua"
                            BorderThickness="1">
                        <TabControl Margin="0,15,0,0"
                                    Style="{StaticResource StandardTabControl}"
                                    x:Name="tabControl">
                            <TabItem Header="Start">
                            </TabItem>
                        </TabControl>
                    </Border>
                    <GridSplitter Grid.Column="1"
                                  Background="Transparent"
                                  Width="6"
                                  HorizontalAlignment="Center"></GridSplitter>
                    <Border Grid.Column="2"
                            BorderBrush="Aqua"
                            BorderThickness="1"
                            Margin="0,5,5,5"></Border>
                </Grid>
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding HasItems,ElementName=tabControl}"
                                 Value="false">
                        <Setter TargetName="column"
                                Property="MinWidth"
                                Value="0" />
                        <Setter TargetName="column"
                                Property="Width"
                                Value="0" />
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Control.Template>
    </Control>
</DockPanel>

基于以下假设:当CloseTabItemAction将被调用时,它会从TabItem中移除TabControl,触发器将根据HasItems属性检测到相同内容如果没有项目,则折叠列


修改

根据这里的评论是发现。调整大小GridSplitter时,Local value设置为ColumnDefinition的{​​{1}}属性,其precedence值高于Width,因此触发器会失败修改价值。

建议的解决方案是使用Trigger设置所需的值,因为动画的优先级高于Local值,并且所需的值将应用于属性。

Animation

在上面的代码中我也将分割器宽度设为0,这样左边没有空白