Runes WPF blog

onsdag den 22. august 2007

Namespace referencer til komponenter i andre assemblies

Hvis man har noget i retning af:

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Mynamespace.Controls">

og Mynamespace.Controls er defineret i en refereret assembly - så kan VS ikke finde komponenterne.
Tilføj assembly navn så virker det igen (det er ikke en køn løsning ms har på det):

xmlns:local="clr-namespace:Mynamespace.Controls;assembly=myassembly"

onsdag den 15. august 2007

PackUri og Resourcer i Winforms/WPF Combinationer

WPF under winforms og resourcer

Når man "hoster" sit wpf vindue under en winforms applikation så opstår der nogle uhensigsmæssige sideeffekter omkring resourcer i WPF.
Fx er Application.Current null og det har effekten at man ikke har et globalt sted at lede efter sine resourcer.
Hvis man tilmed ikke har sine xaml filer liggende i samme assembly som programmet, men i en anden assembly - så er man lidt på spanden og må tage PackUri i brug.
I scenariet hovedprogram i en exe der bare står for at hente alle de resterende dele af programmet som er spredt ud i dynamisk linkede assemblies hvor exe'n er winforms og de resterende dele er en blanding.
Der vil man ikke have noget WPF-Applications.Current objekt og hvis man har xaml filer i de øvrige assemblies vil de ikke umiddelbart blive fundet af resourcemanageren.

Hvis man vil loade xaml'en skal man bruge pack uri i source sådan:

pack://application:,,/assemblynavn;component/xamlfilnavn.xaml

hvis man vil gøre det i kode er det nogenlunde sådan her:

string assemblyname = Assembly.GetExecutingAssembly().ToString();
Uri resourceLocater = new Uri("pack://application:,,/" + assemblyname + ";component/" + resourceFile, UriKind.Absolute);
System.Windows.Application.GetResourceStream(resourceLocater);

ResourceDictionary resDict = new ResourceDictionary();
resDict.Source =
resourceLocater ;




tirsdag den 14. august 2007

At sætte DynamicReference i kode

Nogle gange er det nødvendigt at sætte dynamiske resource referencer i kode - fx hvis kontrollen ikke er har en parent endnu.

Det er nemt nok - når man ved det:
SetResourceReference(dependencyproperty, "key")

Ellers kan man sætte en statisk reference i OnLoaded() - brug TryFindResource

Blog oprettet

Når der falder mig noget snedigt wpf stuff ind - så kommer det her!