0

いくつかのカスタムテンプレートでSilverlightToolkitで使用可能なExpanderViewコントロールを使用しています。すべて正常に機能しますが、ExpanderViewが折りたたまれている場合、ExpanderViewが展開されたときにアイテムが存在するヘッダーの下の領域をクリックします。そのアイテムのクリックイベントが発生します。

どうすればこれを修正できますか?どういうわけか、ExpanderViewが折りたたまれているときにタップコマンドを削除するか、ItemPanelを削除して、展開されているときに再度追加する必要がありますか?

<DataTemplate x:Key="CustomItemTemplate">
        <Image delay:LowProfileImageLoader.UriSource="{Binding}" Width="156" Height="95" >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Tap">
                    <cmd:EventToCommand Command="{Binding Storage.ImageTapCommand, Source={StaticResource Locator}}" CommandParameter="{Binding}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Image>
</DataTemplate>

<toolkit:ExpanderView Grid.Column="1" Header="{Binding}"
                  Expander="{Binding}" IsExpanded="{Binding IsExpanded, Mode=TwoWay}"
                  ItemsSource="{Binding Files}" HeaderTemplate="{StaticResource CustomHeaderTemplate}"
                  ExpanderTemplate="{StaticResource CustomExpanderTemplate}"
                  ItemTemplate="{StaticResource CustomItemTemplate}" >
      <toolkit:ExpanderView.ItemsPanel>
             <ItemsPanelTemplate>
                    <toolkit:WrapPanel />
              </ItemsPanelTemplate>
      </toolkit:ExpanderView.ItemsPanel>
</toolkit:ExpanderView>
4

1 に答える 1

2

ExpanderViewが展開/折りたたみされるたびに、また最初にExpanderViewをバインドした直後に(ExpanderView.LayoutUpdatedに接続すると、その目的で正常に機能します)、各エキスパンダーアイテムのルートUIElementのIsHitTestVisibleプロパティを変更できます。これが私のために問題を修正した例です:

    private void FixExpanderItemsInteractivity(ExpanderView expanderView)
    {
        foreach (var item in expanderView.Items)
        {
            ContentPresenter contentPresenter = expanderView.ItemContainerGenerator.ContainerFromItem(item) as ContentPresenter;

            if (contentPresenter != null)
            {
                UIElement expanderItemRootElement = VisualTreeHelper.GetChild(contentPresenter, 0) as UIElement;
                if(expanderItemRootElement != null)
                {
                    expanderItemRootElement.IsHitTestVisible = expanderView.IsExpanded;
                }
            }
        }
    }

    private void Expander_Expanded(object sender, RoutedEventArgs e)
    {
        FixExpanderItemsInteractivity(sender as ExpanderView);
    }

    private void Expander_Collapsed(object sender, RoutedEventArgs e)
    {
        FixExpanderItemsInteractivity(sender as ExpanderView);
    }

    private void Expander_LayoutUpdated(object sender, EventArgs e)
    {
        FixExpanderItemsInteractivity(sender as ExpanderView);
    }
于 2012-10-18T17:53:43.630 に答える