WPF重写DataGrid RowHeader模板,并管理静态选择行 [英] WPF override DataGrid RowHeader template and manage to select rows still

查看:152
本文介绍了WPF重写DataGrid RowHeader模板,并管理静态选择行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 < Style x:Key =RowHeaderStyle TargetType =DataGridRowHeader> 
< Setter Property =Template>
< Setter.Value>
< ControlTemplate TargetType =DataGridRowHeader>
< Button Horizo​​ntalAlignment =StretchVerticalAlignment =StretchStyle ={StaticResource RowHeaderButton}/>
< / ControlTemplate>
< /Setter.Value>
< / Setter>
< / Style>

问题当然是单击按钮不再选择该行。我必须在IsPressed事件上调用自定义方法吗?我如何知道行索引?你如何去做?



谢谢!

解决方案

我已经结束了使用只有样式,原来你可能会做你想要的,如果不是激烈的。如果有人设法获取代码以处理DataGridHeaderBorder上的行选择,请让我知道!
示例:

 < ... xmlns:Microsoft_Windows_Themes =clr-namespace:Microsoft.Windows.Themes; assembly = PresentationFramework.Aero...> 

< BooleanToVisibilityConverter x:Key =bool2VisibilityConverter/>

< LinearGradientBrush x:Key =RowHeaderBackgroundBrushEndPoint =0.728,0.5StartPoint =0.272,0.5>
< GradientStop Color =#FF494949Offset =0/>
< GradientStop Color =#FF3E3E3EOffset =1/>
< GradientStop Color =#FF494949Offset =0.50/>
< GradientStop Color =#FF3E3E3EOffset =0.50/>
< / LinearGradientBrush>

< LinearGradientBrush x:Key =RowHeaderBackgroundBrushMouseOverEndPoint =0.728,0.5StartPoint =0.272,0.5>
< GradientStop Color =#FF666666Offset =0/>
< GradientStop Color =#FF525252Offset =1/>
< GradientStop Color =#FF666666Offset =0.50/>
< GradientStop Color =#FF525252Offset =0.50/>
< / LinearGradientBrush>

< Style x:Key =RowHeaderGripperStyleTargetType ={x:Type Thumb}>
< Setter Property =HeightValue =8/>
< Setter Property =BackgroundValue =Transparent/>
< Setter Property =CursorValue =SizeNS/>
< Setter Property =Template>
< Setter.Value>
< ControlTemplate TargetType ={x:Type Thumb}>
< Border Background ={TemplateBinding Background}Padding ={TemplateBinding Padding}/>
< / ControlTemplate>
< /Setter.Value>
< / Setter>
< / Style>

< Style x:Key =RowHeaderBorderTargetType =Border>
< Setter Property =BackgroundValue ={StaticResource RowHeaderBackgroundBrush}/>
< Setter Property =BorderBrush值=#FF313131/>
< Setter Property =BorderThicknessValue =0,0,1,1/>
< Setter Property =CornerRadiusValue =0/>
< Setter Property =MarginValue =0/>

< Style.Triggers>
< Trigger Property =IsMouseOverValue =True>
< Setter Property =BackgroundValue ={StaticResource RowHeaderBackgroundBrushMouseOver}>< / Setter>
< / Trigger>
< /Style.Triggers>
< / Style>

< Style x:Key =RowHeaderStyle1TargetType =DataGridRowHeader>
< Setter Property =Template>
< Setter.Value>
< ControlTemplate TargetType =DataGridRowHeader>
< Grid>
< Microsoft_Windows_Themes:DataGridHeaderBorder IsPressed ={TemplateBinding IsPressed}Orientation =Horizo​​ntalSeparatorBrush ={TemplateBinding SeparatorBrush}SeparatorVisibility ={TemplateBinding SeparatorVisibility}Style ={StaticResource RowHeaderBorder}>
< StackPanel Orientation =Horizo​​ntal>
< ContentPresenter SnapsToDevicePixels ={TemplateBinding SnapsToDevicePixels}VerticalAlignment =Center/>
< Control SnapsToDevicePixels =falseTemplate ={Binding ValidationErrorTemplate,RelativeSource = {RelativeSource AncestorType = {x:Type DataGridRow}}}Visibility ={Binding(Validation.HasError),Converter = {StaticResource bool2VisibilityConverter },RelativeSource = {RelativeSource AncestorType = {x:Type DataGridRow}}}/>
< / StackPanel>
< / Microsoft_Windows_Themes:DataGridHeaderBorder>
< Thumb x:Name =PART_TopHeaderGripperStyle ={StaticResource RowHeaderGripperStyle}VerticalAlignment =Top/>
< Thumb x:Name =PART_BottomHeaderGripperStyle ={StaticResource RowHeaderGripperStyle}VerticalAlignment =Bottom/>
< / Grid>
< / ControlTemplate>
< /Setter.Value>
< / Setter>
< / Style>


I have overriden the default row header style to use my custom button:

<Style x:Key="RowHeaderStyle" TargetType="DataGridRowHeader">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="DataGridRowHeader">
                <Button HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Style="{StaticResource RowHeaderButton}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

The problem of course is that clicking the button no longer selects the row. Will I have to call a custom method on the IsPressed event? How would I know the row index? How would you go about doing it?

Thanks!

解决方案

I've ended up using only styling which turns out you can probably do what you want if it isn't drastic. If anyone manages to get the code behind to handle row selection on DataGridHeaderBorder please let me know! Example:

<...xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"...>

<BooleanToVisibilityConverter x:Key="bool2VisibilityConverter"/>

<LinearGradientBrush  x:Key="RowHeaderBackgroundBrush" EndPoint="0.728,0.5" StartPoint="0.272,0.5">
    <GradientStop Color="#FF494949" Offset="0"/>
    <GradientStop Color="#FF3E3E3E" Offset="1"/>
    <GradientStop Color="#FF494949" Offset="0.50"/>
    <GradientStop Color="#FF3E3E3E" Offset="0.50"/>
</LinearGradientBrush>

<LinearGradientBrush x:Key="RowHeaderBackgroundBrushMouseOver" EndPoint="0.728,0.5" StartPoint="0.272,0.5">
    <GradientStop Color="#FF666666" Offset="0"/>
    <GradientStop Color="#FF525252" Offset="1"/>
    <GradientStop Color="#FF666666" Offset="0.50"/>
    <GradientStop Color="#FF525252" Offset="0.50"/>
</LinearGradientBrush>

<Style x:Key="RowHeaderGripperStyle" TargetType="{x:Type Thumb}">
    <Setter Property="Height" Value="8"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Cursor" Value="SizeNS"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Thumb}">
                <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="RowHeaderBorder" TargetType="Border">
    <Setter Property="Background" Value="{StaticResource RowHeaderBackgroundBrush}" />
    <Setter Property="BorderBrush" Value="#FF313131" />
    <Setter Property="BorderThickness" Value="0,0,1,1" />
    <Setter Property="CornerRadius" Value="0" />
    <Setter Property="Margin" Value="0" />

    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="{StaticResource RowHeaderBackgroundBrushMouseOver}"></Setter>
        </Trigger>
    </Style.Triggers>
</Style>

<Style x:Key="RowHeaderStyle1" TargetType="DataGridRowHeader">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="DataGridRowHeader">
                <Grid>
                    <Microsoft_Windows_Themes:DataGridHeaderBorder IsPressed="{TemplateBinding IsPressed}" Orientation="Horizontal" SeparatorBrush="{TemplateBinding SeparatorBrush}" SeparatorVisibility="{TemplateBinding SeparatorVisibility}" Style="{StaticResource RowHeaderBorder}">
                        <StackPanel Orientation="Horizontal">
                            <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center"/>
                            <Control SnapsToDevicePixels="false" Template="{Binding ValidationErrorTemplate, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" Visibility="{Binding (Validation.HasError), Converter={StaticResource bool2VisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}"/>
                        </StackPanel>
                    </Microsoft_Windows_Themes:DataGridHeaderBorder>
                    <Thumb x:Name="PART_TopHeaderGripper" Style="{StaticResource RowHeaderGripperStyle}" VerticalAlignment="Top"/>
                    <Thumb x:Name="PART_BottomHeaderGripper" Style="{StaticResource RowHeaderGripperStyle}" VerticalAlignment="Bottom"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这篇关于WPF重写DataGrid RowHeader模板,并管理静态选择行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆