Makale Özeti

Runtime sırasında Xaml oluşturma

Makale

Çalışma anında gelen veriyi farklı kontroller içinde göstermek isteyebiliriz.Örneğin bir metni RichTextBlock elementi içerisinide gösterelim.

Sayfamızda veriyi listelemek için bir listview elementi olsun. Listviewdeki her item için DataTemplate bölümünü düzenleyelim. Bize burda dinamikliği sağlayan kontrol ContentControl elementidir. ContentControl elementine veri bağlandığı an bu veri xamlConverter sınıfı üzerinden işleme tabi tutulacak.

Proje içinde common klasöründe bulunan converter classını sayfa içinde düğümü arasında tanımlıyoruz.
<common: düğümünü görmeniz için Page altında xmlns:common=”using:App7.Common”nameSpace ismini tanımlamalısınız. Burdaki App7 kısmı projenizin ismidir.

 

01     <Page.Resources>
02         <common:XamlConverter x:Key="xamlConverter"/>
03     </Page.Resources>
04  
05     <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
06         <ListView x:Name="listViewContent">
07             <ListView.ItemTemplate>
08                 <DataTemplate>
09                     <Grid  MinHeight="80" Width="250">
10                         <ContentControl x:Name="content" Content="{Binding Converter={StaticResource xamlConverter}}"  MaxHeight="360" Margin="0,0,10,0" FontSize="12"/>
11                     </Grid>
12                 </DataTemplate>
13  
14             </ListView.ItemTemplate>
15         </ListView>
16 </Grid>

 

XamlConverter sınıfı aşağıdaki gibi tanımlıdır. Bu sınıfın converter özelliğinin olması için IValueConverter interfacei uygulaması gerekmektedir.
Convert metodu içindeki value parametresi bizim ContentControl elementine bağlanan veriyi temsil eder.
Örnek bir metin : “Süleyman Demirel Üniversitesi,http://sdu.edu.tr,SDU“

Gelen bu veriyi RichTextBlock içinde kafama göre işliyorum. Şimdilik bu basit bir senaryo.
XamlReader.Load string veriyi xaml olarak paket içine gömüyor.

 

01 public class XamlConverter : IValueConverter
02     {
03         public object Convert(object value, Type targetType, object parameter, string language)
04         {
05             StringBuilder builder = new StringBuilder();
06             string data = value.ToString();
07             string[] arrayData = data.Split(',');
08  
09             builder.Append(arrayData[0] + "<LineBreak/>");
10             builder.Append(String.Format("<InlineUIContainer><HyperlinkButton NavigateUri=\"{0}\" FontSize=\"12\">{1}</HyperlinkButton></InlineUIContainer>",arrayData[1],arrayData[1]));
11             builder.Append("<LineBreak/>");
12             builder.Append(String.Format("<InlineUIContainer><Button Content=\"{0}\"/></InlineUIContainer>", arrayData[2]));
13             string lastXaml = "<RichTextBlock xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><Paragraph>"
14                 + builder.ToString() +
15                 "</Paragraph></RichTextBlock>";
16             return
17                 XamlReader.Load(lastXaml);
18         }
19  
20         public object ConvertBack(object value, Type targetType, object parameter, stringlanguage)
21         {
22             throw new NotImplementedException();
23         }
24     }

 

code içindeki lastXaml’ın değeri aşağıdaki gibi oluştu
last

Örnek datayı listView’e bağlayalım.

01 protected override void OnNavigatedTo(NavigationEventArgs e)
02         {
03             List<string> testList = new List<string>()
04             {
05                  "Süleyman Demirel Üniversitesi,http://sdu.edu.tr,SDÜ",
06                  "Afyon Kocatepe Üniversitesi,www.aku.edu.tr,AKÜ"
07             };
08  
09             listViewContent.ItemsSource = testList;
10         }

 

Çıktı aşağıdaki gibi olacak.
contetnt

Gelen verim formatlı olduğu için basit oldu. Senaryo şu şekilde olabilirdi. Gelen html kodları xaml taraflı anlamlı bir koda dönüştürmeniz gerekebilirdi. Bu durumda Regex sınıfları kullanabilirsiniz.

İyi çalışmalar

Proje link