0

同学们,美好的一天。我以前的开发人员被修改了 default DataGridColumnHeadersPresenter。结果,这种修改后的样式现在适用于解决方案中的所有 DataGrid。

现在我从团队负责人那里得到了在 DataGrid 标题中实现过滤器的任务。我已经创建了自己的风格,DataGridColumnHeader但它不起作用。这里是:

<Style TargetType="{x:Type DataGridColumnHeader}" x:Key="FiltrableHeader"  >

        <Setter Property="VerticalAlignment" Value="Center"></Setter>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="Background" Value="Red"/>
        <Setter Property="SeparatorBrush" Value="{DynamicResource Pallete.Secondary.Darkest}"/>
        <Setter Property="Margin" Value="0,0,2,2"/>
        <Setter Property="Template">

            <Setter.Value>
                <ControlTemplate>
                    <ControlTemplate.Resources>
                        <Storyboard x:Key="ShowFilterControl">
                            <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="filterTextBox" Storyboard.TargetProperty="(UIElement.Visibility)">
                                <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static Visibility.Visible}"/>
                                <DiscreteObjectKeyFrame KeyTime="00:00:00.5000000" Value="{x:Static Visibility.Visible}"/>
                            </ObjectAnimationUsingKeyFrames>
                            <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="filterTextBox" Storyboard.TargetProperty= "(Panel.Background).(SolidColorBrush.Color)">
                                <SplineColorKeyFrame KeyTime="00:00:00"  Value="Transparent"/>
                                <SplineColorKeyFrame  KeyTime="00:00:00.5000000" Value="White"/>
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                        <Storyboard x:Key="HideFilterControl">
                            <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="filterTextBox" Storyboard.TargetProperty="(UIElement.Visibility)">
                                <DiscreteObjectKeyFrame KeyTime="00:00:00.4000000" Value="{x:Static Visibility.Collapsed}"/>
                            </ObjectAnimationUsingKeyFrames>
                            <ColorAnimationUsingKeyFrames BeginTime="00:00:00"  Storyboard.TargetName="filterTextBox" Storyboard.TargetProperty= "(UIElement.OpacityMask).(SolidColorBrush.Color)">
                                <SplineColorKeyFrame KeyTime="00:00:00" Value="Black"/>
                                <SplineColorKeyFrame  KeyTime="00:00:00.4000000" Value="#00000000"/>
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </ControlTemplate.Resources>
                    <Grid x:Name="grid" Width="Auto"  Height="Auto" RenderTransformOrigin="0.5,0.5">
                        <Grid.RenderTransform>
                            <TransformGroup>
                                <ScaleTransform/>
                                <SkewTransform/>
                                <RotateTransform/>
                                <TranslateTransform/>
                            </TransformGroup>
                        </Grid.RenderTransform>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <StackPanel Height="50" >
                            <ContentPresenter x:Name="contentPresenter"
                                 HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                 VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" >
                                <ContentPresenter.Content>
                                    <MultiBinding Converter="{StaticResource headerConverter}">
                                        <MultiBinding.Bindings>
                                            <Binding ElementName="filterTextBox"  Path="Text" />
                                            <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Content" />
                                        </MultiBinding.Bindings>
                                    </MultiBinding>
                                </ContentPresenter.Content>
                            </ContentPresenter>
                            <TextBox x:Name="filterTextBox"
                                    MinWidth="25" Height="23" OpacityMask="Black" Padding="3"  Margin="3 0"
                                    Visibility="Collapsed" TextWrapping="Wrap"
                                    Grid.Column="0"
                                    Grid.ColumnSpan="1"/>
                        </StackPanel>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Trigger.EnterActions>
                                <BeginStoryboard x:Name="ShowFilterControl_BeginStoryboard" Storyboard="{StaticResource ShowFilterControl}"/>
                                <StopStoryboard BeginStoryboardName="HideFilterControl_BeginShowFilterControl"/>
                            </Trigger.EnterActions>
                            <Trigger.ExitActions>
                                <BeginStoryboard x:Name="HideFilterControl_BeginShowFilterControl"  Storyboard="{StaticResource HideFilterControl}"/>
                                <StopStoryboard BeginStoryboardName="ShowFilterControl_BeginStoryboard"/>
                            </Trigger.ExitActions>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>

        </Setter>
    </Style>

当我在 DataGrid 上的 XAML 中使用这种样式时:

<c:FilteringDataGrid
    ItemsSource="{Binding Coefficients}"
    Style="{StaticResource DataGridStyle}"
    CanUserAddRows="False"
    CanUserDeleteRows="False"
    CanUserSortColumns="False"
    SelectionMode="Single"
    AutoGenerateColumns="True"
    ColumnHeaderStyle="{StaticResource FiltrableHeader}"
>

只有标题的高度设置为 50(在样式中定义)。

我哪里错了?如何覆盖默认值DataGridColumnHeadersPresenter?如果我将所有样式设置都放在DataGridColumnHeadersPresenter所有工作正常,但在解决方案中的所有 DataGrids 上。

谢谢!

4

1 回答 1

1

如何“覆盖”当前正在应用的样式取决于DataGridStyle定义方式。

如果我将所有样式设置都放在 DataGridColumnHeadersPresenter 中,一切正常,但在解决方案中的所有 DataGrids 上。

然后,您可以创建一个副本DataGridStyle并添加一个 x:Key 以及您的 DataGridColumnHeader 样式:

<Style x:Key="CopyOfDataGridStyle" TargetType="..." />

然后,您会将Style这个特定的属性分配DataGrid给新的Style

<c:FilteringDataGrid
    ItemsSource="{Binding Coefficients}"
    Style="{StaticResource CopyOfDataGridStyle}" ... />

然后它不会影响DataGrid您的应用程序中的任何其他控件。

于 2020-05-19T15:16:02.747 回答