0

C# コードから GridView アイテムの DataTemplate に格納されている Canvas コントロールにアクセスするにはどうすればよいですか?

<DataTemplate x:Key="250x250ItemTemplate">
    <Grid HorizontalAlignment="Left" Width="250" Height="250">
        <Border Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}">
            <Canvas x:Name="Canv"/>  <------ I WANT ACCESS THIS CANVAS FROM C# CODE
        </Border>
    </Grid>
</DataTemplate>
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <GridView x:Name="GridViewData" ItemTemplate="{StaticResource 250x250ItemTemplate}"/>
</Grid>

リモートで読み込まれた XML からのデータで GridViewData.ItemsSource を設定して、C# コードから GridViewData 項目を埋めています。

次に、各要素の Canvas を (子を追加して) 個別に変更する必要があります。

しかし、どうすればそれができるのかわかりません。

誰でも私を助けることができますか?前もって感謝します!

4

1 に答える 1

1

この質問に答えることに興味のあるすべての人!ここで解決策を見つけました: http://www.wiredprarie.us/blog/index.php/archives/1730

なぜここでそんなに魔法をかける必要があるのか​​ 理解できないのは恐ろしいことですが、うまくいきます.

namespace Extension
{
    public static class FrameworkElementExtensions
    {
        public static FrameworkElement FindDescendantByName(this FrameworkElement element, string name)
        {
            if (element == null || string.IsNullOrWhiteSpace(name))
            {
                return null;
            }
            if (name.Equals(element.Name, StringComparison.OrdinalIgnoreCase))
            {
                return element;
            }
            var childCount = VisualTreeHelper.GetChildrenCount(element);
            for (int i = 0; i < childCount; i++)
            {
                var result = (VisualTreeHelper.GetChild(element, i) as FrameworkElement).FindDescendantByName(name);
                if (result != null)
                {
                    return result;
                }
            }
            return null;
        }
    }
}

for (int i = 0; i<GridViewTickers.Items.Count; i++)
{
    var element = GridViewTickers.ItemContainerGenerator.ContainerFromIndex(i) as FrameworkElement;
    if (element != null)
    {
        var tb = element.FindDescendantByName("Canv") as Canvas;
        if (tb != null)
        {
            TextBlock tb1 = new TextBlock();
            tb1.Text = "hello";
            tb.Children.Add(tb1);
        }
    }
}

この一連のコードで私たちが何をしているのかを説明できる人がいれば、これをしてください。私の脳は今爆発しています :)

皆さん、ありがとうございました!

于 2012-11-19T17:01:47.877 に答える