Tôi đang cố tạo mẫu của riêng mình cho điều khiển Expander
. Khi điều khiển được mở rộng, tôi muốn nội dung trượt xuống từ từ.Hoàn thành hoạt ảnh "trượt xuống" trong WPF
Chiều cao mong muốn của nội dung không được biết tại thời gian biên dịch.
Tôi nghĩ chúng ta có thể xác định trượt xuống như một phim hoạt hình:
<Storyboard x:Key="ExpandContent">
<DoubleAnimation
Storyboard.TargetName="_expanderContent"
Storyboard.TargetProperty="Height"
From="0.0"
To="{Binding ElementName=_expanderContent,Path=DesiredHeight}"
Duration="0:0:1.0" />
</Storyboard>
Nhưng Đáng tiếc là không. Chúng tôi gặp lỗi
Không thể cố định cây dòng thời gian Storyboard này để sử dụng trong các chuỗi.
Dường như chúng tôi không thể sử dụng liên kết khi xác định thông số hoạt ảnh. (Cũng thảo luận trong this question.)
Có ai có ý tưởng nào về cách tôi có thể tiếp cận điều này không? Tôi cảnh giác với việc sử dụng LayoutTransform.ScaleY
, vì điều đó sẽ tạo ra một hình ảnh méo mó.
Điều này tương tự như this question, nhưng câu hỏi này có câu trả lời liên quan đến viết mã-đằng sau, mà tôi không nghĩ là có thể trong mẫu kiểm soát. Tôi tự hỏi nếu một giải pháp dựa trên XAML có thể đạt được hay không.
Đối với những gì đáng giá, đây là trạng thái hiện tại của mẫu kiểm soát của tôi.
<ControlTemplate x:Key="ExpanderControlTemplate" TargetType="{x:Type Expander}">
<ControlTemplate.Resources>
<!-- Here are the storyboards which don't work -->
<Storyboard x:Key="ExpandContent">
<DoubleAnimation
Storyboard.TargetName="_expanderContent"
Storyboard.TargetProperty="Height"
From="0.0"
To="{Binding ElementName=_expanderContent,Path=DesiredHeight}"
Duration="0:0:1.0" />
</Storyboard>
<Storyboard x:Key="ContractContent">
<DoubleAnimation
Storyboard.TargetName="_expanderContent"
Storyboard.TargetProperty="Height"
From="{Binding ElementName=_expanderContent,Path=DesiredHeight}"
To="0.0"
Duration="0:0:1.0" />
</Storyboard>
</ControlTemplate.Resources>
<Grid Name="MainGrid" Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Name="ContentRow" Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ContentPresenter ContentSource="Header" />
<ToggleButton Template="{StaticResource ProductButtonExpand}"
Grid.Column="1"
IsChecked="{Binding Path=IsExpanded,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}"
/>
<Rectangle Grid.ColumnSpan="2" Fill="#FFDADADA" Height="1" Margin="8,0,8,2" VerticalAlignment="Bottom"/>
</Grid>
</Border>
<ContentPresenter Grid.Row="1" HorizontalAlignment="Stretch" Name="_expanderContent">
</ContentPresenter>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="True">
<Setter TargetName="_expanderContent" Property="Height" Value="{Binding ElementName=_expanderContent,Path=DesiredHeight}" />
<!-- Here is where I would activate the storyboard if they did work -->
<Trigger.EnterActions>
<!--<BeginStoryboard Storyboard="{StaticResource ExpandContent}"/>-->
</Trigger.EnterActions>
<Trigger.ExitActions>
<!--<BeginStoryboard x:Name="ContractContent_BeginStoryboard" Storyboard="{StaticResource ContractContent}"/>-->
</Trigger.ExitActions>
</Trigger>
<Trigger Property="IsExpanded" Value="False">
<Setter TargetName="_expanderContent" Property="Height" Value="0" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
Tại sao đặt 'To' và' From' thành DesiredHight? Nếu bạn không đặt chúng, nó sẽ được thực hiện tự động anyway. – icebat