如何在RowDetails RowHeaderTemplate中动态设置按钮高度

时间:2018-12-09 14:11:28

标签: wpf xaml

我有一个带有Deails-View的数据网格,该视图显示了另一个数据网格。通常不显示第二个网格。在行标题中,有一个带有左箭头的按钮,单击该按钮时,将显示详细信息网格,并且箭头变为向下箭头。所有这些都可以正常工作,但是行标题中只有一个“小区域”可以接受点击。这是我的RowHeader-Template的代码:

            <DataGrid.RowHeaderTemplate>
                <DataTemplate>
                    <Button  Click="DataGridRowHeader_Button_Click" Cursor="Hand" HorizontalAlignment="Center"  Width="40" >
                        <Button.Style>
                            <Style TargetType="Button">
                                <Style.Setters>
                                    <Setter Property="VerticalAlignment" Value="Top" />
                                    <Setter Property="Template">
                                        <Setter.Value>
                                            <ControlTemplate TargetType="{x:Type Button}">
                                                <Grid >
                                                    <Border Background="Chartreuse" BorderBrush="Black" BorderThickness="5"></Border>
                                                    <Path Fill="Blue" Data="M 0,0 14,7 0,14 Z" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                                </Grid>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>

                                 </Style.Setters>
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow}},Path=DetailsVisibility}" Value="Visible">
                                        <Setter Property="Background" Value="Salmon" />
                                        <Setter Property="Height" Value="125" />
                                        <Setter Property="Template">
                                            <Setter.Value>
                                                <ControlTemplate TargetType="{x:Type Button}" >
                                                    <Grid >
                                                        <Border Background="LightCoral" BorderBrush="Black" BorderThickness="1" />
                                                        <Path Fill="Blue" Data="M 0,0 14,0 7,14 Z" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                                    </Grid>
                                                </ControlTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Button.Style>
                    </Button>
                </DataTemplate>
            </DataGrid.RowHeaderTemplate>

行与

  

Setter属性=“高度”值=“ 125”

展开按钮

enter image description here

,但是按钮不适合行标题。较小的值表示按钮缩小,而较高的表示按钮则行标题不必要地扩展。

我尝试将Heigth值绑定到某些参数,例如g。

            <Setter Property="Height" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRowDetailsEventArgs}}, Path=DetailsElement.ActualHeight}" />

(DataGridRowDetailsEventArgs在我向后看代码时会捕获正确的高度值:

    private void dg_RowDetailsVisibilityChanged(object sender, DataGridRowDetailsEventArgs e)
    {
        Trace.WriteLine(e.DetailsElement.ActualHeight);
    }

)。使用

<Setter Property="Height" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRowDetails}}, Path=ActualHeight}" />

也不起作用,RowHeader总是扩展到一个值,该值似乎是整个Master-Datagrid的高度。

有什么想法可以正确调整按钮的尺寸吗? (很抱歉,颜色仅用于查看用户界面的不同部分。)

Hucky

1 个答案:

答案 0 :(得分:0)

我认为您的问题出在ControlTemplate的{​​{1}}内,您无法正确对齐内容(在您的情况下,您的DataGridRowHeader

我不是每次都用完整的Button覆盖ContentTemplate,而是尝试使用XamlAlignmentControlTemplateExtension)的另一种方法,该方法为我做了必要的步骤(克隆并调整默认值MarkupExtension),这样我只需要做类似的事情

ControlTemplate

要解决您的问题,您只需执行几个步骤

  1. 设置<Setter Property="Template" Value="{AlignmentControlTemplate Type={x:Type WhatEverType}}" /> DataGridRowHeader

    ControlTemplate
  2. 根据需要设置<DataGrid.RowHeaderStyle> <Style TargetType="DataGridRowHeader"> <Setter Property="Template" Value="{stackoverflow:AlignmentControlTemplate Type={x:Type DataGridRowHeader}}"></Setter> </Style> </DataGrid.RowHeaderStyle> 和/或VerticalContentAlignment(在您的情况下,HorizontalContentAlignment

    VerticalContentAlignment=Stretch
  3. 您的<DataGrid.RowHeaderStyle> <Style TargetType="DataGridRowHeader"> <Setter Property="VerticalContentAlignment" Value="Stretch"></Setter> <Setter Property="Template" Value="{stackoverflow:AlignmentControlTemplate Type={x:Type DataGridRowHeader}}"></Setter> </Style> </DataGrid.RowHeaderStyle>

    中的一些调整

    替换

    Style.Triggers

    使用

    <Setter Property="Height" Value="125" />
    

修改最终结果

<Setter Property="VerticalAlignment" Value="Stretch" />