2

「MaxColumns」と呼ばれる依存関係プロパティを持つ、カスタム ItemsPanel を持つ ItemsControl を含む UserControl があります。カスタム パネルの「MaxColumns」プロパティをアニメーション化できる VisualState (UserControl レベル) を定義したいと思います。

基本的に、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 で直接実行できるようにする必要があると思いますか?

4

1 に答える 1

3

確かに、 は実際のItemsPanelオブジェクトではなく、オブジェクトを作成するためのテンプレートです。したがって、技術的には、参照は機能しません。

実装については次のとおりです。

  1. ItemsPanel (いずれにしてもテンプレート) に添付プロパティを設定しますが、ItemsControl 自体に設定します。
  2. CoolPanelを使用して、の MaxColumns をその添付プロパティにバインドしRelativeSource FindAncestorます。

まあ、添付プロパティを省略して、それを使用することもできますTag:-) 確かに、ItemsControlは完全にあなたの制御下にあるので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>
于 2011-07-13T18:28:54.707 に答える