Devel.cz Lupa Měšec Podnikatel Root Zdroják.cz DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Názory k článku
Dynamicky generované komponenty v Silverlightu 2.0

Štěpán Bechynský aura:95
3. 3. 2009 8:23 Nový

XamlReader

celé vlákno
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.
Jan Jelínek aura:88
3. 3. 2009 9:00 Nový

Re: XamlReader

celé vlákno
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:-)
Jiří Knesl
Jiří Knesl (neregistrovaný) ---.awebsys.cz
3. 3. 2009 9:26 Nový

Děkuji

celé vlákno
Děkuji za zajímavý článek. Přál bych si na zdrojáku víc takových.
Rene Stein aura:100
3. 3. 2009 12:47 Nový

Popup v Silverlightu

celé vlákno
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);
}

}
janis
janis (neregistrovaný) ---.146.broadband9.iol.cz
16. 6. 2009 9:42 Nový

Re: Popup v Silverlightu

celé vlákno

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é.

Zasílat nově přidané příspěvky e-mailem