2011-03-11 14 views
0

ラップパネルの動作とサイズ変更可能なコントロールでグリッドを作成したいのですが、どうすればいいですか? 多分それは私がイメージして欲しいものを表示するように簡単です:WPFでサイズ変更可能なコントロールを備えたグリッドライクなWrapPanel

初期状態:

enter image description here

それはように、2x2のセルの周囲に取り、その後2を制御しますので、方向右下と制御1のサイズを変更しますグリッド上での位置を再配置します:それはバックリサイズだとき

enter image description here

をそれが戻って初期状態にする必要があります。

答えて

1

アニメーションを作成するには、Panelの拡張クラスを作成するだけです。アニメーションを作成する方法についてはvery good articleですWrapPanel次に、Triggerを使用してそれぞれのアイテムを伸縮させるアイテムに対して、DataTemplateを作成する必要があります。これはTriggerでアニメ化することもできます。 Panelは、Panel.ArrangeOverrideメソッドに設定したコードに応じて、アイテムがサイズを変更すると自動的に他のアイテムを移動します。

アイテム(四角形)として使用するデータ型(クラス)を作成する必要があります。このクラスは、ボックス番号を格納する文字列プロパティと、それを大きく表示するかどうかをUIに知らせるためにboolIsLargeプロパティが必要です。私は実際にこのコードを試していないが、しかし、あなたにはこのようなものを使用することができ、あなたのDataTemplate:私は定義していない

<Style TargetType="{x:Type ListBoxItem}" x:Key="BoxStyle"> 
    <Setter Property="ContentTemplate" Value="{StaticResource BoxTemplate}" /> 
    <Style.Resources><!-- this removes the default blue selection colour --> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#00FFFAB0" /> 
     <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#00FFFAB0" /> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> 
     <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" /> 
    </Style.Resources> 
    <Style.Triggers><!-- comment this section out, or declare a SelectedBoxTemplate DataTemplate --> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="ContentTemplate" Value="{StaticResource SelectedBoxTemplate}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

<DataTemplate DataType="{x:Type YourXmlNameSpace:YourDataType}" x:Key="BoxTemplate"> 
    <Border Name="Border" BorderBrush="Black" BorderThickness="1" CornerRadius="3" Height="100" Width="100"> 
     <TextBlock Text="{Binding YourTextProperty}" /> 
    </Border> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding IsLarge}" Value="True"><!-- (A Boolean property) --> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Height" From="100" To="200" Duration="0:0:0.5" /> 
         <DoubleAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Width" From="100" To="200" Duration="0:0:0.5" /> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.EnterActions> 
      <DataTrigger.ExitActions> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Height" From="200" To="100" Duration="0:0:0.5" /> 
         <DoubleAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Width" From="200" To="100" Duration="0:0:0.5" /> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.ExitActions> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

は、その後、あなたがこのような各 ListBoxItemDataTemplateを関連付けます任意の SelectedBoxTemplate DataTemplateですが、 Style.Triggerを使用して有効になる別のものを宣言することができます。

最後に、あなたはこのようなあなたのListBox何か宣言します次に:グリッド内の応答のための

<ListBox ItemsSource="{Binding YourCollection}" ItemContainerStyle="{StaticResource BoxStyle}"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <YourXmlNameSpace:YourAnimationPanel /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 
+0

おかげで、実際にコントロール(あなたがIsLarge性を有する示唆1)のUIがあるので、手動でサイズ変更可能です非常にインタラクティブなので、私たちは自分自身をアニメーション化するため、データ型のアニメーションを作成しません。私は、サイズ変更可能なコントロールを作成しようとしたが、私はどのようにラッパー(カスタムパネルで述べた)を実装するためのアイデアを持っていない – dnr3

+0

私はこれを行う方法を示す非常に良い記事へのリンクを提供した...あなたがしなければならないすべて'Panel.MeasureOverride'と' Panel.ArrangeOverride'メソッドのコードを少し調整しています。あなたのコードは、少し複雑になりますが、コードの例に非常に似ているはずです。この例のコードでは、最大の 'child.DesiredSize.Height'を使って各行の高さを決定していますが、大きな行を1つずつ持つ2つの小さなボックスを各行に配置できるようにするには、ここでさらに行う必要があります。 – Sheridan

関連する問題