#wpf #silverlight #datagrid #visualstatemanager
#wpf #silverlight #datagrid #visualstatemanager
Вопрос:
У меня есть простой DataGrid
в Silverlight с шаблонами этих столбцов:
<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;
}
Ответ №1:
Может быть, это немного взлом, но как насчет анимации MinWidth
и MaxWidth
в столбце? В основном устанавливайте их в соответствии с тем, что вы хотите сделать, и анимируйте MinWidth
до более высокого значения для расширения и анимируйте MaxWidth
до более низкого значения для сворачивания.
Вот полный xaml для анимации на MinWidth (я все еще считаю, что это несколько по-хакерски):
<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>
Комментарии:
1. Я смог заставить их анимировать. Смотрите этот код:
<Storyboard x:Key="OnMouseEnter1"> <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(DataGridColumn.MinWidth)" Storyboard.TargetName="dataGridTextColumn"> <EasingDoubleKeyFrame KeyTime="0:0:1" Value="150"/> </DoubleAnimationUsingKeyFrames> </Storyboard>
2. Просто для добавления… Мне не удалось получить
Width
свойство для анимации в xaml (я использую blend). Но я вижуDataGridColumn.WidthProperty
,DataGridColumn.MinWidthProperty',
DataGridColumn . MaxWidthProperty’ как свойство зависимости. И вы правы… Я не уверен, как анимировать длину DataGridLength, ноinWidth
иMaxWidth
просто удваиваются 🙂3. хм … вы уверены, что можете анимировать минимальную и максимальную ширину? я думаю, что они должны быть свойствами зависимостей, чтобы иметь возможность анимировать…
4. Пример, который я привел в своем первом комментарии, отлично работал в xaml… Однако я не делал этого в коде.
5. Ой, извините, я имел в виду код xaml. Но теперь я знаю почему… Вы используете WPF, а я говорил о Silverlight! 🙂 В любом случае, 1, как в WPF, это сработает! Другим потенциальным решением, я думаю, является использование
DataGridTemplateColumn
вместо этого, тогда вы можете анимировать элемент управления внутриDataTemplate
, не анимируя фактический столбец.