in

Dé specialist in .NET trainingen en consultancy

Jo-wen Mei

februari 2008 - Posts

  • Mole: een uitgebreide Debugger Visualizer

     

    Visual studio maakt sinds de 2005 versie gebruikt van Debug Visualizers.

    Dat zijn die schermpjes die de waarde van de variable die je aan het debuggen bent een stuk leesbaarder weergeven:

    image

     

    Nu hebben een aantal wpf experts een hele uitgebreide wpf visualizer gemaakt. (en het werkt overigens ook voor winforms, asp.net, wf, wcf)

    Je kan eigenlijk heel de structuur van de applicatie bestuderen en wijzigen. Erg leerzaam.....

     

    Ik zou hier alles kunnen gaan uitleggen, maar ik raad iedereen aan het artikel zelf te lezen!

    (lijkt lang, maar dat komt ook door de vele screens. En dan nog is het zeker de moeite waard!)

    Om alvast een tipje van de sluier op te lichten, hier een greep uit de features:

    • Lightning fast performance is realized by using a multi-threaded, lazy-loaded architecture for passing data between processes. We also used custom serialization of our data objects to reduce the number of fields that are packaged and sent over the visualizer's remoting channel.
    • View application UI elements in a TreeView control.
    • View all properties, dependency properties and attached properties and non-public fields of any element or sub-element in the UI tree.
    • Editing of properties in all project types
    • Multi-level drilling into objects and child objects, viewing any of their data.
    • Breadcrumb type navigation when drilling into child objects.
    • For properties that are IEnumerable, view all of their data. The collection data is grouped in an expandable and collapsible region.
      • Data can be viewed in the grid with object properties which allows drilling into child object properties.
      • Data can be viewed in a separate grid using the Mole Collection Viewer.
      • View heterogeneous collections of data in one or more grid, where each grid displays the values of objects with the same type.
    • Properties that you have defined as your favorites are grouped together and pinned at the top of the grid.
    • View an image which represents the element being visualized (whenever possible).
    • View run-time XAML in an HTML viewer for an element (whenever possible).
    • Persisted application state and reload of settings from a previous Mole session. ('Who ever heard of a Visualizer with saved settings?')
    • Search for properties/fields and specific data values in various ways.
    • Configure which columns to display.
    • Single click selection. No double clicking is required anywhere in Mole.
    • Mole is contained in one DLL, so it is very easy to deploy.
    • Mole does not use any registry settings.

    Meer info

  • Visual Tree vs Logical Tree (part II)

     

    Ok, in deel I heb ik globaal uitgelegd wat deze 2 termen inhouden.

    Tevens heb ik verteld hoe je door deze tree's kan lopen met de bijbehorende treehelpers.

    Echter, voordat je in de boom klimt, zijn er een aantal dingen die je moet weten om er niet uit te vallen.

    Hier een samenvatting met de rariteiten:

    • De visual tree bestaat uit elementen die nodig zijn om het uiteindelijke scherm tevoorschijn te toveren 

    (gebruikt voor rendering, routed events, lokaliseren van resources, etc)

    Alle afgeleide klassen van ContentElement kunnen in de ui voorkomen, maar zitten niet in de visual tree. WPF doet alsof ze er zijn om event routing te laten werken. VisualTreeHelper kan niet omgaan met ContentElement objecten omdat ContentElement geen afgeleide is van Visual or Visual3D!

    • De logical tree bestaat uit de achterliggende hierarchische structuur (lijkt op de definitie in de xaml)

    (gebruikt voor dependency property value inheritance, resource resolution, etc)

    Om te beginnen kan de logische tree objecten van elk type bevatten. (in tegenstelling tot de visual tree, die alleen instanties van DependencyObject heeft). Jammer genoeg kan de LogicalTreeHelper ook alleen omgaan met DependencyObject instanties.

    Verder heeft een Window/Page/Control maar één visual tree, terwijl deze meerdere logical trees kan bevatten. Deze zijn niet met elkaar verbonden, dus je kan er ook niet met de LogicalTreeHelper tussen navigeren.

    Hoe kunnen er meerdere logical trees bestaan?

    Controls en data objecten hebben geen visuele weergave van zichzelf. Ze vertrouwen op templates die vertellen hoe ze gerendered moeten worden.

    Zo'n template kan uitgebreid worden om echt zichtbare elementen te laten renderen.

    De elementen die onderdeel zijn van de uitgebreide template, creeeren hun eigen logical tree, welke dus niet verbonden is met de logical tree van het object waar ze origineel voor gecreeerd zijn.

    Meer info (en methodes om de hele tree te doorlopen)

    Posted feb 05 2008, 11:01 by Jo-wen with no comments
    Filed under:
  • Auto increment AssemblyVersion

    Ok, in deze post wil ik jullie gewoon een feitje meedelen waar je niet 123 achter komt (ik iig niet)

     

    In het huidige software project hebben een update-mechanisme wat checked of er nieuwe updates beschikbaar zijn.

    Deze check gebeurt aan de hand van de AssemblyFileVersion. Deze info is puur informatief en reflecteert de AssemblyVersion die opgeslagen zit in de metadata tabel van de assembly.

    We willen de versie opvragen terwijl het programma al opgestart is, dus om enig gezeur met gelockte files te voorkomen gebruiken we de AssemblyFileVersion.

     

    Nu kunnen we gelukkig gebruik maken van de auto-increment functie van visual studio.

    Als je het patroon "1.0.*" gebruikt krijg je altijd een uniek versie nummer. (let op: het is gebaseerd op de timestamp, dus het gaat niet netjes met 1 omhoog)

     

    De AssemblyFileVersion moet gelijk zijn aan de AssemblyVersion, dus ik doe zoiets:

    [assembly: AssemblyVersion("1.0.*")]
    [assembly: AssemblyFileVersion("1.0.*")]

     

    Maar ik zie in Explorer niet veel gebeuren....  

    Wat blijkt nu, je moet de AssemblyFileVersion NIET specificeren, en dan blijft deze gelijk aan de AssemblyVersion, en is deze dus zichtbaar in je Explorer.

     

    Een vs add-in voor meer controle over de versioning

  • Template binding errors in WPF

    Wpf heeft nog wat kinderziektes. Er zijn namelijk nog standaard templates die fouten genereren.

    Het kan dus voorkomen dat je databinding errors krijgt, terwijl je wpf controls "normaal" gebruikt.

    In je log zie je dan bijvoorbeeld dit:

    System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'ContentPresenter' (Name='Content'); target property is 'HorizontalAlignment' (type 'HorizontalAlignment')

     

    Ik schrok nogal toen ik het zag, want hij kwam heel veel voorbij.

    Dus ik op allerlei mogelijke manieren geprobeerd de HorizontalContentAlignment property te definieren, maar helaas.

    Na het strippen van alle custom code (styles, usercontrols, etc) bleef ik de fout houden.

    Ik had het bij een TabItem control, maar het schijnt dus bij meerdere controls voor te komen.

     

    Overigens zijn het geen echte exceptions, dus zou het de performance niet drastisch mogen beinvloeden.

    Meer info over debuggen van databindings

    Posted feb 04 2008, 10:13 by Jo-wen with no comments
    Filed under: