2011-07-13 4 views
2

"MaxColumns"と呼ばれる依存プロパティを持つカスタムItemsPanelを持つItemsControlを含むUserControlがあります。カスタムパネルの "MaxColumns"プロパティをアニメーション化できるVisualState(UserControlレベル)を定義したいと思います。本質的にはWPF VisualStateManager - テンプレートされた子の中でプロパティをアニメーション化する方法

、XAMLのようなものになります。

<Grid x:Name="LayoutRoot"> 
    <VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="MyCoolState"> 
     <VisualState x:Name="Normal" /> 
     <VisualState x:Name="NotNormal"> 
     <Storyboard> 
      <Int32Animation Duration="0" 
          Storyboard.TargetName="Details" 
          Storyboard.TargetProperty="(ItemsControl.ItemsPanel).(local:CoolPanel.MaxColumns)" 
          To="4" /> 
     </Storyboard> 
     </VisualState> 
    </VisualStateGroup> 
    <VisualStateManager> 
    <ItemsControl x:Name="Details"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
     <local:CoolPanel x:Name="MyCoolPanel" 
         MaxColumns="1" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    </ItemsControl> 
</Grid> 

をしかし、私は私の人生のために右の構文はアニメーション何のためにあるのかを把握することはできませんか?上記の構文を使用すると、「ItemsPanel」プロパティがパス '(0)。(1)'のDependencyObjectを指していないというエラーが表示されます。これは、技術的にはItemsPanelTemplateを指しているからです。

Storyboard.TargetNameプロパティの「MyCoolPanel」を直接参照すると、Nameスコープに関するエラーが発生します(おそらく、「MyCoolPanel」がLayoutRootの名前スコープにないためです)。 "TargetName"に名前スコープを修飾する方法があるかどうかわかりません。

誰にでも解決策がありますか? にする必要がありますか?つまり、私はプロパティを追加することに反対していませんが、XAMLでこれを直接行うことができなくてはいけないと思いますか?

+0

あなたのXAMLコードは右、いくつかのControlTemplateの一部ですか? – Vlad

+0

実際それはUserControlの一部です。 "LayoutRoot"グリッドは、UserControlのルートコントロールです。 – Jordan0Day

答えて

3

実際、ItemsPanelは、実際のオブジェクトではなく、オブジェクトが作成されるテンプレートです。技術的にはあなたの参照はうまくいかないでしょう。

私は、実装については、次を持っている:

  1. あなたは(とにかくテンプレートです)ItemsPanelではなく、ItemsControlの自体にいくつかの添付プロパティを設定します。
  2. RelativeSource FindAncestorを使用して、CoolPanelのMaxColumnsをその接続プロパティにバインドします。まあ

、あなたは添付プロパティを省略し、そして実際に、ItemsControlが完全にコントロールしているので、何の罪がTag少しを乱用ではありません:-)それのためTagを使用することができます。

ので、コードは次のようになります:

<Grid x:Name="LayoutRoot"> 
    <VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="MyCoolState"> 
     <VisualState x:Name="Normal" /> 
     <VisualState x:Name="NotNormal"> 
     <Storyboard> 
      <Int32Animation Duration="0" 
          Storyboard.TargetName="Details" 
          Storyboard.TargetProperty="Tag" 
          To="4" /> 
     </Storyboard> 
     </VisualState> 
    </VisualStateGroup> 
    <VisualStateManager> 
    <ItemsControl x:Name="Details" Tag="3"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
     <local:CoolPanel 
      MaxColumns="{Binding Tag, RelativeSource={RelativeSource FindAncestor, 
              AncestorType=ItemsControl}}" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    </ItemsControl> 
</Grid> 
+0

これはかなり巧妙なハックです、私は本質的に価値を渡すためにタグを使用することを考えていませんでした。私は、実際には、CoolPanelクラスの添付プロパティを定義して使用する方が好きかもしれないと思います。しかし、他に誰も何も出てこないなら、これを答えとしてマークします。 – Jordan0Day

関連する問題