Всем привет! У меня какая-то странная штука случилась, даже не думал что может такая элементарная вещь не работать.. Есть DockPanel с двумя панелями внутри, нижняя меняет высоту, верхняя - работает по принципу LastChildFill=True. То есть лэйаут диктует нижняя панель. В ней ListView и он у меня либо высоты 80 либо высоты как весь DockPanel (использую DockPanel.ActualHeight). Вот код разметки: Код | <DockPanel x:Name="center_dock" LastChildFill="True"> <!-- Основной ListView --> <ListView x:Name="main_ListView" ScrollViewer.VerticalScrollBarVisibility="Auto" ItemTemplate="{StaticResource OneTileItem}" BorderBrush="{x:Null}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" DockPanel.Dock="Bottom" SelectionChanged="main_ListView_SelectionChanged"/> <!-- Панель пердпросмотра --> <ContentControl x:Name="previewPanel" DockPanel.Dock="Top" VerticalAlignment="Stretch" Height="Auto"> <ContentControl.Style> <Style TargetType="{x:Type ContentControl}"> <Setter Property="Template" Value="{StaticResource textPreview}"/> <Style.Triggers> <DataTrigger Binding="{Binding Path=Type}" Value="photo-doc"> <Setter Property="Template" Value="{StaticResource photoPreview}" /> </DataTrigger> </Style.Triggers> </Style> </ContentControl.Style> </ContentControl>
</DockPanel>
|
А вот все места в коде, где добавляю динамику: Код | private bool is_bottom_fixed = false; // флаг. Если он true - значит ListView высоты 80, иначе ListView.Height=DockPanel.ActualHeight
//по умолчанию высота ListView на максимуме private void Window_Loaded(object sender, RoutedEventArgs e) { main_ListView.Height = center_dock.ActualHeight; }
//потом в какой-то момент уменьшаем высоту до 80, пока все ок private void singleItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (e.ClickCount == 2) { if (((Border)sender).Tag.ToString() != "" || ((Border)sender).Tag.ToString() != null) { MainListViewItem mlvi = main_ListView.SelectedItem as MainListViewItem; if (mlvi.Type == "photo-doc") //запустить предпросмотр { AnimateHeightDouble(main_ListView, main_ListView.ActualHeight, 80, .2); is_bottom_fixed = true; } } } else { return; } }
// при ресайзе окна высоту сохраняем в зависимости от флага, пока тоже все ок private void Window_SizeChanged(object sender, SizeChangedEventArgs e) { if (!is_bottom_fixed) { main_ListView.Height = center_dock.ActualHeight; } else if (is_bottom_fixed) { main_ListView.Height = 80; } else return; }
//НО, как только обратно увеличиваю высоту с 80 на всю высоту DockPanel, то при ресайзе высота не переприсваивается! private void photo_preview_EditBtn_Click(object sender, RoutedEventArgs e) { AnimateHeightDouble(main_ListView, 80, center_dock.ActualHeight, .2); is_bottom_fixed = false; }
//Анимация на всякий случай private void AnimateHeightDouble(FrameworkElement ctrl, double from, double to, double time) { DoubleAnimation dba = new DoubleAnimation(); dba.From = from; dba.To = to; dba.Duration = TimeSpan.FromSeconds(time); ctrl.BeginAnimation(FrameworkElement.HeightProperty, dba); }
|
Не пойму почему не происходит переприсваивания высоты. Т.е. если в момент увеличивающей анимации center_dock.ActualHeight был 400, то он потом всегда 400 при ресайзе окна. А нужно, чтобы менялся вместе с ActualHeight. Помогите, срочно нужно(( Это сообщение отредактировал(а) San4o_Pan4o - 22.12.2009, 14:26
|