Runes WPF blog

onsdag den 5. september 2007

Menuer der ikke vil makke ret

Når man laver en menu og vil have et enkelt MenuItem til at udfylde hele Menu kontrollen så er man på den... Den vil kun size til headerens størelse. Så kan man style.. det er besværligt. et hurtigt lille hack der virker og ikke er så grimt endda :)


<menu row="2" background="Transparent">
<menuitem name="InnerMenu" background="Transparent" header="" width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Menu}, Path=ActualWidth}">
</menuitem>
</menu>

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!