WPF XAML serialize/diziselize qilish

mening ilovam asosan boshqa tekshiruvlarni o'z ichiga olgan bitta wpf kanvasini oladi va uni xml fayliga ketma-ket beradi va keyin ketma-ket ma'lumotlarni yoki oldindan saqlangan ma'lumotni ko'rsatish uchun seriyali holga keltiradi. Serileştirme/diziselleştirme ishlashi yaxshi, har bir narsa saqlanadi va qayta tiklanadi. Muammo shundaki, ketma-ketlikdan keyin rasmni manba kodi bilan o'zgartirmoqchi bo'lsam, u ishlamayapti:

testLogo.Source = new BitmapImage(new Uri(file.FileName));

Image XAML-da quyidagi tarzda yoziladi:

 

Deserializatsiya kodi quyidagicha:

Canvas canvas = DeSerializeXAML(appPath + "\\tmp\\mainCanva.xml") as Canvas;
mainCanva.Children.Clear();

while (canvas.Children.Count > 0)
{
       UIElement obj = canvas.Children[0]; 
       canvas.Children.Remove(obj); 
       mainCanva.Children.Add(obj);//Add to canvas
}

Shuni alohida ta'kidlash joizki, Snoop-dan foydalanib nima sodir bo'layotganini aniqlashga harakat qilaman, chunki Snoop, shuningdek, Snoop'ning rasm manbasini o'zgartira olmaydi, biroq agar Snoop-ni Snoop-ni qayta ishga tushiradigan bo'lsak, Snoop-ni suratga olishni to'xtatib qo'ying. manba. "Eski" Snoop oynasi testLogo.Source = buyruqlaridan yangilangan rasm manbasini ko'rish mumkin. wpf inspektorida ushbu muammo yo'q, chunki u ketma-ket siljish sodir bo'lganda uni darhol yangilaydi. Mening taxminimcha, ingl. Daraxtda noto'g'ri narsa bor ... va wpf buni bajarishi mumkin, deb o'ylayman.

Yordamchilar uchun rahmat.

Serialize/Deserialize funktsiyalarini talab qilganda:

public static void SerializeToXAML(UIElement element, string filename)
    {
        string strXAML = System.Windows.Markup.XamlWriter.Save(element);

        using (System.IO.FileStream fs = System.IO.File.Create(filename))
        {
            using (System.IO.StreamWriter streamwriter = new System.IO.StreamWriter(fs))
            {
                streamwriter.Write(strXAML);
            }
        }
    }

    public static UIElement DeSerializeXAML(string filename)
    {
        using (System.IO.FileStream fs = System.IO.File.Open(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read))
        {
            return System.Windows.Markup.XamlReader.Load(fs) as UIElement;
        }
    }
2
faylni ImageViewer oynasida ochsangiz, testLogo.Source = yangi BitmapImage (yangi Uri (file.FileName)); , va bu erda: Canvas canvas = DeSerializeXAML (appPath + "\\ tmp \\ mainCanva.xml") Canvas sifatida; - canvas null emasmi?
qo'shib qo'ydi muallif AnjumSKhan, manba
DeSerializeXAML usulingiz qanday amalga oshiriladi?
qo'shib qo'ydi muallif mm8, manba
DeSerializeXAML usulingiz qanday amalga oshiriladi?
qo'shib qo'ydi muallif mm8, manba
Fayl juda yaxshi ko'rsatiladi va tuval nostalji emas, chunki hamma narsa ketma-ket o'chirishdan so'ng ko'rsatiladi. Yangilangan savolda serileştirme/deserializasyon vazifalari e'lon qilingan.
qo'shib qo'ydi muallif JohnG, manba
Fayl juda yaxshi ko'rsatiladi va tuval nostalji emas, chunki hamma narsa ketma-ket o'chirishdan so'ng ko'rsatiladi. Yangilangan savolda serileştirme/deserializasyon vazifalari e'lon qilingan.
qo'shib qo'ydi muallif JohnG, manba

6 javoblar

O'zgaruvchan ma'lumotnomangizni yangilashingiz kerak.

MainCanva.Children.Clear() ga qo'ng'iroq qilganda, testLogo, shu jumladan, barcha bolalarni olib tashlanadi. O'zingizning testLogo o'zgaruvchisi hali ham UI ning bir qismi emasligiga qaramasdan original testLogo obyektiga ishora qiladi.

Buni ko'ring:

Canvas canvas = DeSerializeXAML(appPath + "\\tmp\\mainCanva.xml") as Canvas;
mainCanva.Children.Clear();

while (canvas.Children.Count > 0)
{
       UIElement obj = canvas.Children[0]; 
       canvas.Children.Remove(obj); 
       mainCanva.Children.Add(obj);//Add to canvas
}
testLogo = mainCanva.FindName("testLogo") as Image;
0
qo'shib qo'ydi
Bu ishlamadi, baribir javob uchun rahmat
qo'shib qo'ydi muallif JohnG, manba

O'zgaruvchan ma'lumotnomangizni yangilashingiz kerak.

MainCanva.Children.Clear() ga qo'ng'iroq qilganda, testLogo, shu jumladan, barcha bolalarni olib tashlanadi. O'zingizning testLogo o'zgaruvchisi hali ham UI ning bir qismi emasligiga qaramasdan original testLogo obyektiga ishora qiladi.

Buni ko'ring:

Canvas canvas = DeSerializeXAML(appPath + "\\tmp\\mainCanva.xml") as Canvas;
mainCanva.Children.Clear();

while (canvas.Children.Count > 0)
{
       UIElement obj = canvas.Children[0]; 
       canvas.Children.Remove(obj); 
       mainCanva.Children.Add(obj);//Add to canvas
}
testLogo = mainCanva.FindName("testLogo") as Image;
0
qo'shib qo'ydi
Bu ishlamadi, baribir javob uchun rahmat
qo'shib qo'ydi muallif JohnG, manba

O'zgaruvchan ma'lumotnomangizni yangilashingiz kerak.

MainCanva.Children.Clear() ga qo'ng'iroq qilganda, testLogo, shu jumladan, barcha bolalarni olib tashlanadi. O'zingizning testLogo o'zgaruvchisi hali ham UI ning bir qismi emasligiga qaramasdan original testLogo obyektiga ishora qiladi.

Buni ko'ring:

Canvas canvas = DeSerializeXAML(appPath + "\\tmp\\mainCanva.xml") as Canvas;
mainCanva.Children.Clear();

while (canvas.Children.Count > 0)
{
       UIElement obj = canvas.Children[0]; 
       canvas.Children.Remove(obj); 
       mainCanva.Children.Add(obj);//Add to canvas
}
testLogo = mainCanva.FindName("testLogo") as Image;
0
qo'shib qo'ydi
Bu ishlamadi, baribir javob uchun rahmat
qo'shib qo'ydi muallif JohnG, manba

Ilova resurslaridan foydalanib tugatdim:


    file:///C:/Users/test_B&W.png

keyin kodda:

Resources["AVItestLogoic"] = ...

Visual daraxtiga nima bo'lishidan qat'iy nazar, dastur manbai har doim o'ng narsani ko'rsatib turadi

0
qo'shib qo'ydi

Ilova resurslaridan foydalanib tugatdim:


    file:///C:/Users/test_B&W.png

keyin kodda:

Resources["AVItestLogoic"] = ...

Visual daraxtiga nima bo'lishidan qat'iy nazar, dastur manbai har doim o'ng narsani ko'rsatib turadi

0
qo'shib qo'ydi

Ilova resurslaridan foydalanib tugatdim:


    file:///C:/Users/test_B&W.png

keyin kodda:

Resources["AVItestLogoic"] = ...

Visual daraxtiga nima bo'lishidan qat'iy nazar, dastur manbai har doim o'ng narsani ko'rsatib turadi

0
qo'shib qo'ydi