Jakub Florczyk - Blog o programowaniu .NET i Android

Programista praktyczny

Designery kontrolek w .NET Compact Framework

Ktokolwiek tworzył edytory kontrolek w Windows Forms, wie że jest to droga przez mękę. Jednak to co go czeka w Compact Framework można tylko nazwać drogą przez piekło ;-)

O ile w standardowych Form-sach designer może być zawarty w bibliotece kontrolki w CF jest to niewykonalne. Wynika to z błahej przyczyny – braku implementacji edytorów w bibliotekach CF. A więc jak to zrobić?

Tworzenie edytora dla określonej kontrolki musimy zacząć od stworzenia Windows Class Library:

classlibrary

Kolejnym krokiem jest dodanie referencji do System.Design abyśmy uzyskali dostęp do base-owych edytorów:

systemdesign

W tak przygotowaną bibliotekę możemy dodać naszą klasę edytora. W naszym przykładzie stworzymy klasę edytora dla kontrolki ToolBar:

internal class ToolBarDesigner : ControlDesigner
{
	public ToolBarDesigner()
	{
	}
}

Zadaniem tego designera będzie powiązanie buttonów dziedziczących po klasie Component z naszym ToolBar-em. Powiązanie to jest wymagane przy wykonywaniu przenoszenia / kopiowania ToolBar-a z jednego form-a na drugi. Zrealizujemy je przez przeciążenie właściwości AssociatedComponents ControlDesigner-a:

public override ICollection AssociatedComponents
{
	get
	{
		ToolBar control = this.Control as ToolBar;
		if (control != null)
		{
			return control.Buttons;
		}
		return base.AssociatedComponents;
	}
}

Następnym krokiem jest powiązanie naszego designera z konkretną kontrolką. Aby to uzyskać musimy wskazać naszemu ToolBar-owi jakiego edytora ma używać. Jednak nie możemy tego wykonać przez bezpośrednie wskazanie klasy a przez referencję do biblioteki.

Na początek podpisujemy bibliotekę kluczem:

signing

W kolejnym kroku musimy ją zarejestrować w Global Assembly Cache. Aby sobie ułatwić zadanie możemy rejestrowanie dodać do zdarzeń po kompilacji:

postbuildevent

“C:Program FilesMicrosoft Visual Studio 8SDKv2.0Bingacutil.exe” /u “$(TargetName)”
“C:Program FilesMicrosoft Visual Studio 8SDKv2.0Bingacutil.exe” /i “$(TargetPath)”
Pierwsza linijka wyrejestrowuje bibliotekę a druga rejestruje.

Ostatnim krokiem powiązania jest wskazanie w pliku Design-Time Attribute klasy (o tych plikach pisałem w tym artykule), która ma być użyta jako edytor:

<?xml version="1.0" encoding="utf-16"?>
	<Classes xmlns="http://schemas.microsoft.com/VisualStudio/2004/03/SmartDevices/XMTA.xsd">
		<Class Name="Cubicsoft.WindowsMobile.Controls.ToolBar">
			<Designer>
				<Type>Cubicsoft.WindowsMobile.Controls.Design.ToolBarDesigner, Cubicsoft.WindowsMobile.Controls.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=c223de6bc083912b</Type>
				<BaseType></BaseType>
			</Designer>
		</Class>
	</Classes>
</xml>

W wyniku otrzymujemy funkcjonalność przenoszenia powiązanych komponentów między form-ami.

Leave a Reply