Có một tính năng trong Blend được gọi là FluidLayout có thể thực hiện việc này.
Trong Blend
- Tạo một nhóm trạng thái mới, thiết lập một khoảng thời gian chuyển tiếp và cho phép bố trí chất lỏng.
- Tạo hai trạng thái một cho ngang, một cho theo chiều dọc.
- Sau đó, bạn có thể sử dụng hành vi để chuyển đổi giữa chúng.
Nếu bạn không có Blend, bạn có thể tải xuống SDK cần có các tệp bắt buộc Microsoft.Expression.Interactions và System.Windows.Interactivity. Thêm tài liệu tham khảo vào các mẫu này và thử mẫu bên dưới.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:il="clr-namespace:Microsoft.Expression.Interactivity.Layout;assembly=Microsoft.Expression.Interactions"
xmlns:ic="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"
x:Class="WpfApplication4.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">
<Grid x:Name="LayoutRoot">
<VisualStateManager.CustomVisualStateManager>
<ic:ExtendedVisualStateManager/>
</VisualStateManager.CustomVisualStateManager>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="Orientation" ic:ExtendedVisualStateManager.UseFluidLayout="True">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="00:00:00.3000000"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="Vertical"/>
<VisualState x:Name="Horizontal">
<Storyboard>
<ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="stack" Storyboard.TargetProperty="(StackPanel.Orientation)">
<DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static Orientation.Horizontal}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<StackPanel x:Name="stack" Margin="8,49,8,8">
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
<Button Content="Button"/>
</StackPanel>
<Button HorizontalAlignment="Left" Margin="8,8,0,0" VerticalAlignment="Top" Width="97" Height="25" Content="H">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ic:GoToStateAction StateName="Horizontal"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<Button HorizontalAlignment="Left" Margin="109,8,0,0" VerticalAlignment="Top" Width="97" Height="25" Content="V">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ic:GoToStateAction StateName="Vertical"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</Grid>
</Window>
Bạn có thể sử dụng phương pháp tương tự để xử lý chuyển tiếp mục bằng cách sử dụng trạng thái để di chuyển các phần tử hoặc bằng cách thay đổi Grid.Row, RowSpan, Col. Bạn có thể cần một số mã để buộc tất cả mọi thứ lại với nhau. Tôi đang xem xét một mẫu phức tạp hơn tôi sẽ đăng nếu tôi phân loại các vấn đề.
ruột của tôi nói với tôi rằng bạn sẽ phải viết một số mã để làm một số biến đổi dịch, và nó sẽ không được đẹp. Sẽ rất thú vị để xem liệu có ai đến với một cách hay không. – Ray
Bạn đang cố gắng đặt nó trong một khu vực nhất định quan hệ với ViewBox ... ví dụ bạn luôn có thể đặt nó ở bên trái và bên dưới ViewBox bất kể kích thước ViewBox hay ...? –
Nó có thể không đạt được * hiệu quả mong muốn *, nhưng một cách mượt mà hơn để làm thay đổi sự thay đổi này, có thể ít phức tạp hơn để thực hiện, có thể làm mờ văn bản và sau đó quay lại khi bạn thay đổi hướng của StackPanel (sử dụng 'DataTrigger ', ví dụ, và Start-/EndActions của nó, mặc dù tôi không biết làm thế nào bạn có thể dễ dàng có được thời gian đúng ...) –