【问题标题】:it's posible to animate DataGrid column collapsing in Silverlight/WPF?是否可以为 Silverlight/WPF 中折叠的 DataGrid 列设置动画?
【发布时间】:2011-10-24 13:40:46
【问题描述】:

我在 Silverlight 中有一个简单的 DataGrid 与此列模板:

<data:DataGrid AutoGenerateColumns="False" ...>

    <data:DataGridTextColumn x:Name="idCol" Header="Id" Binding="{Binding Id}" />

    <data:DataGridTextColumn x:Name="nameCol" Header="Name" Binding="{Binding Name}" />

    <data:DataGridTextColumn x:Name="descriptionCol" Header="Description" Binding="{Binding Description}" />

</data:DataGrid

我想以动画方式折叠和展开一些列。那可能吗?因为我不能在列宽模板上使用 VSM,而且列宽不是 DP,所以它是 DataGridLength

private void ExpandColumns()
{
    // not animated expanding
    //myDataGrid.Columns[0].Visibility = Visibility.Visible;
    //myDataGrid.Columns[2].Visibility = Visibility.Visible;.

}

private void CollapseColumns()
{
    // not animated collapsing
    //myDataGrid.Columns[0].Visibility = Visibility.Collapsed;
    //myDataGrid.Columns[2].Visibility = Visibility.Collapsed;

}

【问题讨论】:

    标签: wpf silverlight datagrid visualstatemanager


    【解决方案1】:

    可能有点小题大做,但是如何在列上为MinWidthMaxWidth 设置动画呢?基本上根据你想要做的设置它们并将MinWidth设置为更高的值以进行扩展,并将MaxWidth设置为更低的值以进行折叠。

    这是在 MinWidth 上制作动画的完整 xaml(我仍然认为这有点骇人听闻):

    <Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SolveProblems.MainWindow"
    x:Name="Window"
    Title="MainWindow"
    Width="640" Height="480">
    <Window.Resources>
        <Storyboard x:Key="OnClick1">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(DataGridColumn.MinWidth)" Storyboard.TargetName="dataGridCheckBoxColumn">
                <EasingDoubleKeyFrame KeyTime="0:0:1" Value="80"/>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(DataGridColumn.MinWidth)" Storyboard.TargetName="dataGridCheckBoxColumn1">
                <EasingDoubleKeyFrame KeyTime="0:0:1" Value="90"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </Window.Resources>
    <Window.Triggers>
        <EventTrigger RoutedEvent="ButtonBase.Click" SourceName="button">
            <BeginStoryboard Storyboard="{StaticResource OnClick1}"/>
        </EventTrigger>
    </Window.Triggers>
    <Grid x:Name="LayoutRoot">
        <DataGrid x:Name="dataGrid" Margin="100,54,129.5,82.5">
            <DataGrid.Columns>
                <DataGridCheckBoxColumn x:Name="dataGridCheckBoxColumn" Width="{Binding Columns[0].MinWidth, ElementName=dataGrid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                <DataGridCheckBoxColumn x:Name="dataGridCheckBoxColumn1" Width="{Binding Columns[1].MinWidth, ElementName=dataGrid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
            </DataGrid.Columns>
        </DataGrid>
        <Button x:Name="button" Content="Button" HorizontalAlignment="Right" Margin="0,115,22,0" VerticalAlignment="Top" Width="75"/>
    
        </Grid>
    

    【讨论】:

    • 我能够让它们制作动画。见此代码:&lt;Storyboard x:Key="OnMouseEnter1"&gt; &lt;DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(DataGridColumn.MinWidth)" Storyboard.TargetName="dataGridTextColumn"&gt; &lt;EasingDoubleKeyFrame KeyTime="0:0:1" Value="150"/&gt; &lt;/DoubleAnimationUsingKeyFrames&gt; &lt;/Storyboard&gt;
    • 只是补充...我无法让Width 属性在xaml 中进行动画处理(我正在使用混合)。但我确实看到DataGridColumn.WidthPropertyDataGridColumn.MinWidthProperty', DataGridColumn.MaxWidthProperty' 作为依赖属性。你是对的......我不确定如何为 DataGridLength 设置动画,但 inWidthMaxWidth 只是双打:)
    • hmm...您确定可以为 MinWidth 和 MaxWidth 设置动画吗?我认为它们必须是依赖属性才能动画...
    • 我在第一条评论中给出的示例在 xaml 中运行良好......但我没有在后面的代码中这样做。
    • 糟糕,对不起,我的意思是 xaml 代码。但现在我知道为什么了……您使用的是 WPF,而我说的是 Silverlight! :) 无论如何,+1 就像在 WPF 中一样,这将起作用!我认为另一种可能的解决方案是使用DataGridTemplateColumn,然后您可以为DataTemplate 内的控件设置动画,而无需为实际列设置动画。
    猜你喜欢
    • 2016-02-21
    • 2011-03-17
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2015-10-22
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多