Komentáře k článku
Dynamicky generované komponenty v Silverlightu 2.0

V článku si na několika jednoduchých příkladech ukážeme, jak lze dynamicky vytvářet komponenty za běhu aplikace, a jak můžete s takovými komponentami pracovat. V jednotlivých příkladech si postup porovnáme s jejich tvorbu pomocí XAML.
XamlReader
Další možnost, jak dynamicky generovat uživatelské rozhraní, je použít třídu XamlReader ze System.Windows.Markup (http://msdn.microsoft.com/en-us/library/system.windows.markup.xamlreader.aspx). Není pak problém na straně serveru vygenerovat XAML a "podstrčit" ho do již běžící aplikace.
Re: XamlReader
jj… XamlReader je naprosto zásadní například v případě, že použijeme MVC pattern a Model bude na straně serveru. (s tímto se teď peru ve své bakalářce:-)
Děkuji
Děkuji za zajímavý článek. Přál bych si na zdrojáku víc takových.
Popup v Silverlightu
Pěkný článek, Když se tu bavíme o dynamickém generování UI, tak bych chtěl upozornit na jednu nepřijšmnou vlastnost-bug v Silverlightu.
Jestliže máte vlastni User Control, ve kterém je Popup a ztento Popup neobsahuje ListBox (a možná další prvky), je možné Popup zobrazit a používat, aniž by byl přidán do kolekce Children. Takto definovaný POPUP funguje bez problémů.
<pexeso:popupbase x:class="RStein.Pexeso.SaveFile" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:pexeso="clr-namespace:RStein.Pexeso">
<grid x:name="LayoutRoot" background="Black">
<popup name="filesPopup">
<popup.child>
<stackpanel orientation="Vertical" background="Red">
<textblock text="Název souboru s uloženou hrou" fontsize="15" margin="5,5,5,0" horizontalalignment="Left" foreground="White" textdecorations="Underline"></textblock>
<stackpanel orientation="Horizontal">
<textbox name="txtFile" margin="5" minwidth="200"></textbox>
<textblock foreground="Yellow" visibility="Collapsed" name="txtError" text="Musíte zadat platný název souboru!" horizontalalignment="Left" verticalalignment="Center" fontweight="Bold" fontsize="10"></textblock>
</stackpanel>
<stackpanel orientation="Horizontal" margin="5">
<button style="{StaticResource DialogButton}" content="Uložit" name="btnSelect" click="btnSelect_Click"></button>
<button style="{StaticResource DialogButton}" content="Zpět" name="btnBack" click="btnCancel_Click"></button>
</stackpanel>
</stackpanel>
</popup.child>
</popup>
</grid>
</pexeso:popupbase>
Jestliže ale Popup obsahuje Listbox (a pravděpodobně i jiné prvky), Popup se zuobrazí, ale při vybrání libovolné položky v ListBoxu celý plugin do obsluhy události UnhandledException a napíše jen něco o interní fatální chybě. Mimochodem, Bety a RC Silverlightu tohle podle mě nedělaly.
Tento popup způsobí pád Silverlightu, jestliže Popup není přidán do kolekce Children.
<pexeso:popupbase x:class="RStein.Pexeso.SelectFile" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:pexeso="clr-namespace:RStein.Pexeso">
<grid x:name="LayoutRoot" background="Black">
<popup name="filesPopup">
<popup.child>
<stackpanel orientation="Vertical" background="Red">
<textblock text="Vyberte uloženou hru" fontsize="15" margin="5,5,5,0" horizontalalignment="Left" foreground="White" textdecorations="Underline"></textblock>
<textblock foreground="Yellow" visibility="Collapsed" fontsize="10" name="txtError"></textblock>
<border cornerradius="20" background="White">
<listbox name="lstFiles" background="Orange" height="200">
<listbox.itemtemplate>
<datatemplate>
<textblock text="{Binding Mode=OneWay}" foreground="White"></textblock>
</datatemplate>
</listbox.itemtemplate>
</listbox>
</border>
<stackpanel orientation="Horizontal">
<button style="{StaticResource DialogButton}" content="Vybrat soubor" name="btnSelect" click="btnSelect_Click"></button>
<button style="{StaticResource DialogButton}" content="Zpět" name="btnBack" click="btnCancel_Click"></button>
</stackpanel>
</stackpanel>
</popup.child>
</popup>
</grid>
</pexeso:popupbase>
Před zobrazením Popupu tedy musíme vždy přidat Popu do kolekce Children a po uzavřeni Popupu jej případně odebrat.
rivate void btnLoad_Click(object sender, RoutedEventArgs e)
{
SelectFile file = new SelectFile();
var files = FileAccessComponent.Instance.GetRootFiles();
if (files.Length == 1)
{
return;
}
file.FileListBox.ItemsSource = files;
LayoutRoot.Children.Add(file);
file.DialogClosed += file_DialogClosed;
showPopup(file.FilesPopup);
file.FileListBox.Focus();
}
DialogClosed je moje vlastní událost v předkovi pro všechny dialogy.
{
SelectFile sfDialog = sender as SelectFile;
try
{
if (sfDialog.LastResult == DialogResult.OK && sfDialog.FileListBox.SelectedItem != null)
{
m_currentGame = PexesoGame.Load(sfDialog.FileListBox.SelectedItem.ToString());
removeButtons();
rebindGameData();
}
}
catch (Exception e1)
{
Console.WriteLine(e1);
}
finally
{
LayoutRoot.Children.Remove(sfDialog); //Pridat do kolekce
sfDialog.DialogClosed -= saveFileDialog_DialogClosed;
hidePopup(sfDialog.FilesPopup);
}
}
Re: Popup v Silverlightu
Komponenty z toolkitu ani tak v popup nefungují. A bohežel další dost
omezující chyba. Při smázání záznamu z gridu se grid nepřekreslí a
zůstane v něm prázdný řádek po smazaném záznamu. Pokud uživatel
smázne záznamy v gridu všechny, poslední dva řádky se nesmažou a
zůstanou prázdné.