سؤال

أنا أستخدم WPF مع .NET 3.0.

لدي datatemplate بسيطة نسبيا المعرفة بأنها celltemplate لمرض الشبكة. أتوقع أن تحتوي خاصية VisualTree الخاصة بـ Datatemplate على FrameworkElementFactory ، لكن الخاصية لاغية عندما أحاول الوصول إليها من حدث GridViewColumnHeader.click. لماذا VisualTree Null؟ أحتاج إلى الوصول إليه. هنا تعريف ListView:

<ListView ItemsSource="{Binding Stuff}" GridViewColumnHeader.Click="Header_Click">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="28">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Image Name="statusImage" Width="16" Height="16" Source="../Images/media_play_green_16x16.png"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

وهنا معالج الحدث:

private void Header_Click(object sender, RoutedEventArgs e)
{
    GridViewColumnHeader gvch = e.OriginalSource as GridViewColumnHeader;

    // error! VisualTree is null!
    //gvch.Column.CellTemplate.VisualTree.GetType(); 
}
هل كانت مفيدة؟

المحلول

هذا هو السلوك المعروف والمتوقع. لا يمكنني العثور على MSDN أو أي اقتباس "موثوق" آخر الآن ، ولكن منشور منتديات MSDN هذا يشرح (نوع من!):

FrameWorkTemplate.VisualTree Property ... يتم استخدامه بشكل أساسي عند إنشاء DataTemplate/ControlTemplate برمجيًا ، عند تحديد datatemplate/controlTemplate باستخدام XAML ، ستكون هذه الخاصية فارغة ، لأنه يستخدم WPF آلية أخرى لإنشاء إنشاء قوالب تم إنشاؤها XAML وبناءها. (تم اضافة التأكيدات)

لذلك لا يتم ملء خاصية VisualTree عند تحميل قالب من XAML: يتم ملؤها فقط إذا قمت ببناء القالب في الكود باستخدام FrameworkElementFactory.

للحصول على محتوى قالب محدد في XAML ، Call FrameworkTemplate.loadContent (). سيؤدي ذلك إلى تحقيق مثيل للقالب ويعطيك عنصر الجذر - يمكنك بعد ذلك الحفر كما هو مطلوب وتعيين الخصائص أو الارتباطات. الأمر متروك لك لتفكيك المثيل الملمس في النافذة المحتوية أو الشجرة المرئية للسيطرة ، لذلك ربما ترغب في تغليف هذا!

نصائح أخرى

السبب وراء كونها شجرة مرئية لاغية هو أن خاصية الشجرة المرئية أقرب إليها شجرة منطقية عوضا عن مرئي واحد. يتم تخزين المحتوى الفعلي للقالب في TemplateContent كائن ليس لديه أعضاء عامين ، سيتعين عليك استخدامه loadContent طريقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top