Nesne Ağacında Olmayan Nesne Öğelerini Başlatma

Başlatmanın bazı yönleri Windows Presentation Foundation (WPF) , genellikle mantıksal ağaca veya görsel ağaca bağlı olan öğeyi kullanan işlemlere ertelenir. Bu konu, herhangi bir ağaca bağlı olmayan bir öğeyi başlatmak için gerekli olabilecek adımları açıklamaktadır.

Öğeler ve mantıksal ağaç

Kodda bir sınıfın örneğini oluşturduğunuzda Windows Presentation Foundation (WPF) , bir sınıf için nesne başlatmasının birkaç yönü Windows Presentation Foundation (WPF) sınıf Oluşturucu çağrılırken yürütülen kodun bir parçası değildir. Özellikle bir denetim sınıfı için, bu denetimin görsel gösteriminin çoğu Oluşturucu tarafından tanımlanmamıştır. Bunun yerine, görsel temsili denetimin şablonu tarafından tanımlanır. Şablon, çok çeşitli kaynaklardan gelir, ancak çoğu zaman şablon tema stillerinden elde edilir. Şablonlar etkili bir şekilde geç bağlamadır; gerekli şablon, denetim düzen için hazırlanana kadar söz konusu denetime eklenmez. Ayrıca Denetim, köke bir işleme yüzeyine bağlanan bir mantıksal ağaca iliştirilene kadar, düzen için de kullanıma uygun değildir. Mantıksal ağaçta tanımlanan tüm alt öğelerini işlemeyi Başlatan kök düzeyi öğedir.

Görsel ağaç Ayrıca bu işleme katılır. Şablonlar aracılığıyla görsel ağacın bir parçası olan öğeler, bağlanana kadar de tam olarak başlatılamaz.

Bu davranışın sonuçları, bir öğenin tamamlanmış görsel özelliklerine dayanan bazı işlemlerin ek adımlar gerektirmelerdir. Oluşturulan ancak henüz bir ağaca eklenmemiş olan bir sınıfın görsel özelliklerini almaya çalışıyorsanız örnek bir örnektir. Örneğin, Render bir üzerinde çağırmak isterseniz RenderTargetBitmap ve geçirdiğiniz görsel bir ağaca bağlı olmayan bir öğe ise, ek başlatma adımları tamamlanana kadar bu öğe görsel olarak tamamlanmaz.

BeginInit kullanma ve öğeyi başlatmak için

İçindeki çeşitli sınıflar WPF , ISupportInitialize arabirimini uygular. BeginInit EndInit Kodunuzda, başlatma adımları içeren bir bölgeyi (işlemeyi etkileyen özellik değerlerini ayarlama gibi) göstermek için ve yöntemlerini kullanın. EndInitSırayla çağrıldıktan sonra, Düzen sistemi öğeyi işleyebilir ve örtülü bir stil aramaya başlayabilir.

Üzerinde özellikleri ayarladığınız öğe bir FrameworkElement veya FrameworkContentElement türetilmiş bir sınıfsa, ' nin sınıf sürümlerini ' a atama yerine çağırabilirsiniz BeginInit EndInit ISupportInitialize .

Örnek Kod

Aşağıdaki örnek, işleme API 'Leri kullanan bir konsol uygulaması için örnek kod ve XamlReader.Load(Stream) XAML BeginInit EndInit işlemeyi etkileyen ÖZELLIKLERI ayarlamaya yönelik diğer API çağrılarının doğru yerleşimini göstermek için gevşek bir dosya örneğidir.

Örnek yalnızca ana işlevi gösterir. İşlevler Rasterize ve Save (gösterilmez), görüntü Işleme ve GÇ 'nin ele aldığı yardımcı işlevlerdir.

[STAThread]
static void Main(string[] args)
{
    UIElement e;
    string file = Directory.GetCurrentDirectory() + "\\starting.xaml";
    using (Stream stream = File.Open(file, FileMode.Open))
    {
        // loading files from current directory, project settings take care of copying the file
        ParserContext pc = new ParserContext();
        pc.BaseUri = new Uri(file, UriKind.Absolute);
        e = (UIElement)XamlReader.Load(stream, pc);
    }

    Size paperSize = new Size(8.5 * 96, 11 * 96);
    e.Measure(paperSize);
    e.Arrange(new Rect(paperSize));
    e.UpdateLayout();

    /*
     *   Render effect at normal dpi, indicator is the original RED rectangle
     */
    RenderTargetBitmap image1 = Rasterize(e, paperSize.Width, paperSize.Height, 96, 96);
    Save(image1, "render1.png");

    Button b = new Button();
    b.BeginInit();
    b.Background = Brushes.Blue;
    b.Width = b.Height = 200;
    b.EndInit();
    b.Measure(paperSize);
    b.Arrange(new Rect(paperSize));
    b.UpdateLayout();

    // now render the altered version, with the element built up and initialized

    RenderTargetBitmap image2 = Rasterize(b, paperSize.Width, paperSize.Height, 96, 96);
    Save(image2, "render2.png");
}
<STAThread>
Shared Sub Main(ByVal args() As String)
    Dim e As UIElement
    Dim _file As String = Directory.GetCurrentDirectory() & "\starting.xaml"
    Using stream As Stream = File.Open(_file, FileMode.Open)
        ' loading files from current directory, project settings take care of copying the file
        Dim pc As New ParserContext()
        pc.BaseUri = New Uri(_file, UriKind.Absolute)
        e = CType(XamlReader.Load(stream, pc), UIElement)
    End Using

    Dim paperSize As New Size(8.5 * 96, 11 * 96)
    e.Measure(paperSize)
    e.Arrange(New Rect(paperSize))
    e.UpdateLayout()

    '            
    '             *   Render effect at normal dpi, indicator is the original RED rectangle
    '             
    Dim image1 As RenderTargetBitmap = Rasterize(e, paperSize.Width, paperSize.Height, 96, 96)
    Save(image1, "render1.png")

    Dim b As New Button()
    b.BeginInit()
    b.Background = Brushes.Blue
    b.Height = 200
    b.Width = b.Height
    b.EndInit()
    b.Measure(paperSize)
    b.Arrange(New Rect(paperSize))
    b.UpdateLayout()

    ' now render the altered version, with the element built up and initialized

    Dim image2 As RenderTargetBitmap = Rasterize(b, paperSize.Width, paperSize.Height, 96, 96)
    Save(image2, "render2.png")
End Sub

Ayrıca bkz.