2

C# コードの「image」要素にアクセスしたい。データテンプレートにあるため、直接アクセスできないことはわかっています。ビジュアル ツリーを試してみましたが、コードで「イメージ」コントロール要素を取得できません。

<FlipView
            x:Name="flipView"
            AutomationProperties.AutomationId="ItemsFlipView"
            AutomationProperties.Name="Item Details"
            TabIndex="1"
            Grid.RowSpan="2"
            ItemsSource="{Binding Source={StaticResource itemsViewSource}}" SelectionChanged="flipView_SelectionChanged">

            <FlipView.ItemContainerStyle>
                <Style TargetType="FlipViewItem">
                    <Setter Property="Margin" Value="0,137,0,0"/>
                </Style>
            </FlipView.ItemContainerStyle>

            <FlipView.ItemTemplate>
                <DataTemplate>

                    <!--
                        UserControl chosen as the templated item because it supports visual state management
                        Loaded/unloaded events explicitly subscribe to view state updates from the page
                    -->
                    <UserControl Loaded="StartLayoutUpdates" Unloaded="StopLayoutUpdates">
                        <ScrollViewer x:Name="scrollViewer" Style="{StaticResource HorizontalScrollViewerStyle}" Grid.Row="1">

                            <!-- Content is allowed to flow across as many columns as needed -->
                            <common:RichTextColumns x:Name="richTextColumns" Margin="117,0,117,47">
                                <RichTextBlock x:Name="richTextBlock" Width="560" Style="{StaticResource ItemRichTextStyle}" IsTextSelectionEnabled="False">
                                    <Paragraph>
                                        <Run FontSize="26.667" FontWeight="Light" Text="{Binding Title}"/>
                                        <LineBreak/>
                                        <LineBreak/>
                                        <Run FontWeight="Normal" Text="{Binding Subtitle}"/>
                                    </Paragraph>
                                    <Paragraph LineStackingStrategy="MaxHeight">
                                        <InlineUIContainer>
                                            <Image x:Name="image" MaxHeight="480" Margin="0,20,0,10" Stretch="Uniform" Source="{Binding Image}" AutomationProperties.Name="{Binding Title}"/>
                                        </InlineUIContainer>
                                    </Paragraph>                                  
                                </RichTextBlock>
                            </common:RichTextColumns>
                        </ScrollViewer>
                    </UserControl>
                </DataTemplate>
            </FlipView.ItemTemplate>
</FlipView>
4

2 に答える 2

3

あなたが説明したように、試してみましたが、FlipView DataTemplate 内のコントロールにアクセスできました。以下のアプローチを試してみて、これが役立つかどうか教えてください。

public static IEnumerable<T> RecurseChildren<T>(DependencyObject root) where T : UIElement
{
    if (root is T)
    {
        yield return root as T;
    }

    if (root != null)
    {
        var count = VisualTreeHelper.GetChildrenCount(root);


        for (var idx = 0; idx < count; idx++)
        {
            foreach (var child in RecurseChildren<T>(VisualTreeHelper.GetChild(root, idx)))
            {
                yield return child;
            }
        }
    }
}

画像コントロールへのアクセス:

var imageControl = RecurseChildren<Image>(rootVisual).FirstOrDefault();

ここで rootVisual は私のページの Grid インスタンスです。

于 2012-10-01T10:59:29.917 に答える
2

ここで回答https://stackoverflow.com/a/16446670/265706

簡単な答えは次のとおりです。発生している問題は、DataTemplate が繰り返され、FlipView によってコンテンツが生成されていることです。Name は、生成された前の兄弟 (または生成される次の兄弟) と競合するため、公開されません。

したがって、DataTemplate で名前付き要素を取得するには、最初に生成された項目を取得し、次にその生成された項目内で必要な要素を検索する必要があります。XAML の論理ツリーは、名前で物事にアクセスする方法であることを思い出してください。生成されたアイテムは論理ツリーにありません。代わりに、それらはビジュアル ツリーにあります (すべてのコントロールはビジュアル ツリーにあります)。つまり、参照したいコントロールを検索する必要があるビジュアル ツリーにあるということです。VisualTreeHelper を使用すると、これを行うことができます。

于 2013-05-08T18:32:43.807 に答える