Monday, December 6, 2010

Introducing Custom DependencyProperty in WPF

In this sample code I want to introduce three DependencyProperty called Overlap Rotation and UpperOffset in a custom control OverlapStackPannel. The control is simply a StackPanel that arranges the containing items in a custom manner.

In the ArrageOverride method I will use these three properties to locate each item as follows:



   protected  override  System.Windows.Size  ArrangeOverride(System.Windows.Size  arrangeSize)
   {
     UIElementCollection  children = this.InternalChildren;

    int  childrenResolved = 0;
    foreach  (UIElement  child in  children)
    {
 Rect  targetRect = new  Rect ();
 targetRect.X = this .Overlap * childrenResolved;
 targetRect.Y = this .UpperOffset;
 targetRect.Width = child.DesiredSize.Width;
 targetRect.Height = child.DesiredSize.Height;
 child.Arrange(targetRect);
 child.RenderTransform = new  RotateTransform (this .Rotation);
 childrenResolved++;
    }
    return  arrangeSize;
   }



To Achieve this I need to set the properties as follows:


  #region  Property: UpperOffset
  public  static  readonly  DependencyProperty  UpperOffsetProperty = DependencyProperty .Register("UpperOffset" , typeof (double ), typeof (OverlapStackPanel ), new  FrameworkPropertyMetadata (double .NaN, FrameworkPropertyMetadataOptions .AffectsArrange));
      
  /// <summary> 
  /// set or get the upper offset for each item in the pannel 
  /// </summary> 
  public  double  UpperOffset
  {
    get 
    {
      return  (double )this .GetValue(OverlapStackPanel .UpperOffsetProperty);
    }
    set 
    {
      this .SetValue(OverlapStackPanel .UpperOffsetProperty, value );
    }
  }
  #endregion 



and similar for other two.
This makes my OverlapStackPanel having the properties in Blend like this:



Benefits


According to this nice article there are three main advantages of using DependencyProperties comparing to CLR properties:

  • Reduced memory footprint

  • Value inheritance

  • Change notification


Monday, September 27, 2010

C# Warning CS0067: The event 'event' is never used


In my current project I am using a library that is delivered to me. The API in this library provide an interface that is a bit big! The interface requires my class to implement two events as follows:

#region INotifyPropertyChanged Members
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

#endregion
#region INotifyPropertyChanging Members
public event System.ComponentModel.PropertyChangingEventHandler PropertyChanging;




These two events have no meaning in my class and I just have to implement them for the sake of the interface.

As I start to compile my code I see the Warning CS0067 that indicates that my events are not used anywhere, which is true.



As usual, I don't want my code gets spoiled with warnings en I would like to sort out ALL MY WARNINGS. So I came across some options:

  • Ignoring this warnig throughout the project.

    This is too much, I don't want to avoid the benefit of getting this nice warning that just highlighted my problem. But if I would like to do so I need to put the number 0067 in the project properties page in Build tab onder the Supress warnings

  • The less wide solution would be to ignore this warning only in that file and I could do this by putting the code just before my declaration:

    #pragma warning disable 0067

    and then restore it after my declaration using
    #pragma warning restore 0067



  • The last option I just found from MSDN which seems a neat solution is to tell the compiler that I am deliberately not supporting this event and even if it would be called at runtime that would be a mistake.

    To do so I need to throw an exception as follows:
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged
    {
    add { throw new NotSupportedException(); }
    remove { }
    }

    public event System.ComponentModel.PropertyChangingEventHandler PropertyChanging
    {
    add { throw new NotSupportedException(); }
    remove { }
    }





Monday, September 6, 2010

Windows Communication Foundation Built-In Bindings



Binding Class NameTransportMessage EncodingMessage VersionSecurity ModeReliable MessagingTransaction Flow (disabled by default)
BasicHttpBindingHTTPTextSOAP 1.1NoneNot SupportedNot Supported
WSHttpBindingHTTPTextSOAP 1.2 WS-Addressing 1.0MessageDisabledWS-AtomicTransactions
WSDualHttpBindingHTTPTextSOAP 1.2 WS-Addressing 1.0MessageEnabledWS-AtomicTransactions
WSFederationHttpBindingHTTPTextSOAP 1.2 WS-Addressing 1.0MessageDisabledWS-AtomicTransactions
NetTcpBindingTCPBinarySOAP 1.2TransportDisabledOleTransactions
NetPeerTcpBindingP2PBinarySOAP 1.2TransportNot SupportedNot Supported
NetNamedPipesBindingNamed PipesBinarySOAP 1.2TransportNot SupportedOleTransactions
NetMsmqBindingMSMQBinarySOAP 1.2MessageNot SupportedNot Supported
MsmqIntegrationBindingMSMQNot Supported (uses a pre-WCF serialization format)Not SupportedTransportNot SupportedNot Supported
CustomBindingYou DecideYou DecideYou DecideYou DecideYou DecideYou Decide

Monday, August 9, 2010

Changing the Projects Version

The following code may be used in the Macro Studio. It will update the AssemblyInfo files to reflect them with a given version. When the files are required to be chacked out, it will happen automatically.

''' <summary>
''' For all projects in the solution,
''' change the version to a given version
''' </summary>
''' <remarks>some items in the solution might produce an exception
''' for istance if they are not loaded, or they have no vesion
''' </remarks>
Sub ChangeVersionProperties()
Dim sol = DTE.Solution
Dim projectT As EnvDTE.Project = sol.Projects.Item(1)
Dim newVersion As String = "1.200.0.9"

For Each project As EnvDTE.Project In sol.Projects
Try
Debug.Write(project.Name)
Debug.Write(
" changes from ")
Debug.Write(project.Properties.Item(
"AssemblyFileVersion").Value)
Debug.WriteLine(
" to " + newVersion)
project.Properties.Item(
"AssemblyFileVersion").let_Value(newVersion)
Catch ex As Exception
System.Windows.Forms.MessageBox.Show(project.Name +
" kon niet gezet worden: " + ex.Message)
End Try
Next
End Sub

Friday, July 16, 2010

Why Should You Move to Visual Studio 2010

This is the first thing I've got from the early pages of the book Moving to Visual Studio 2010 which looks very interesting to read:


There are numerous reasons to move to Visual Studio 2010 Professional,
but it would be goot do list a few from a high level perspective:
  • Built-in tools for Windows 7, includign multi-touch and "ribbon" UI components.
  • Rich new editor built in WPF that you can highly customize to suit how you work.
  • Multi-monitor support
  • New Quick Search helping to find relevant results just by quickly typing the first few letters of any method, class, or property.
  • Great support for developing and deploying Microsoft Office 2010, SharePoint 2010 and Windows Azure application.
  • Multicore development support allows you to parallelize your applications, and a mew specialized debugger to help you track the tasks and threads.
  • Improvements to the ASP.NET AJAX framework, core JavaScript IntelliSence support, and the inclusion in Visual Studio 2010 of jQuery.
  • Multi-targetting/multi-framework support


Friday, June 25, 2010

Ideale Organisatie

Aangezien de afgelopen 15 jaar ervaring heb ik veel bedrijven gezien en gesproken die op verschillende manier in ICT bezig zijn. Meest van deze bedrijven hebben het heel goed gedaan als het komt op het cijfers van winst en het verkoop van hun services. Echter ga ik vanuit dat de bedrijf waarmee ik in zee ga ook goede groei in de echonomie heeft maar de volgende punten zijn van grote belang voor mij als medewerker.

  1. Flexibel voor Groeiende Technologie
    Het is al lang bekend dat technologische veranderingen in ons sector een onvergelijkbare groei heeft. Daar maakt niet ieder bedrijf nodige stappen, stappen die zorgen om snel de voordelen van technologie kunnen in ons producten meenemen. Vaak maakt men veronderstelling dat we gebruik maken van een techniek met zeer grote enthosiasme zonder rekening te houden dat dit vroeg gaat veroudered worden. De strateeg in een bedrijf heeft als rol om dit dudelijk te maken voor de architecten. De ideale bedrijf is bewust van dit feit en maakt de projectimplementatie losgekoppeld van de techniek en bereid zich alvorens voor de nodige stappen om daarvan af te wijken. Bij ieder integratie zijn er dus documenten nodig die de ontkoppelingproces gaat beschrijven. Hierbij denk ik aan het gebruik van Flash, SilverLight, GeoComponenten, WebServers, enz.

  2. Qualiteit van Producten
    Het is voor ieder bedrijfleider van groot belang om aan de klanten produkten kunnen leveren die een redelijke "qualiteit" behalen. Deze qualiteit is vaak eerder een illusie geworden dan een concreet meetbaar aspect van de producten, niet dat de qualiteit van aard zo is, maar eerder omdat men heeft geen stappen genomen om dit vast te leggen. Er zijn er genoeg methoden en tools om een qualiteit van software en ook van service kunnen meten maar dit is een bewuste keuze die men moet maken. Een goede organisatie weet waar hij staat, ook al niet de gewenste qualiteit behaalt, weet men ten minste dat dit niet te weten is aan de werknemers maar eerder een gekozen strategie. Hierbij kan ik denken aan release management, software governance, WebService performance, enz.

  3. Documentatie
    De tijd om hup-hup-programmeren is al een tijd voorbij. Men besseft dat een programmatuur met 5 to 10 jaar leeftijd behoorlijke documentatie nodig heeft, documenten die zorgen om aanpassingen te doen en features in te bouwen. Documenten die nodig zijn om nieuwe mensen daarbij in te zetten om verder de verantwoordelijkheid kunnen dragen. Meeste IT-ers weten dit al en beginnen vanzelf documenteren. Zelfs meeste projectleiders weiden genoeg tijd hiervoor wat vroeger helemaal niet acceptabel was. Maar weinig organisaties hebben hiervoor een structurele plan. Een plan die geimplementeerd is tot de template level van ieder functie. Een geode documentatie verhoogt de productiviteit en qualiteit. Hierbij kan ik denken aan documenten in diverse fase van ontwikkeling van een product.

  4. Communicatie
    In een klein bedrijf is dit weinig van belang, maar daar ga ik echt niet mee beginnen.
    In een grote bedrijf de leiders in de verschillende hierargie hebben vaak verschillende ideen. Dit komt vaak aan de laagste hierargie, ontwikkelingsteam, in een verwarrende manier. Men krijgt gemengde gevoelens en weet niet goed welk kant zal of moet gaan. Ook tussen de afdelingen en tussen de teams kunnen miscommunicaties vormen die tot belemmering in productiviteit en qualiteit zich kunnen manifesteren. Wanneer de communicatie niet is gestroomlijnd kunnen zelfs in een team bewust miscommunicaties ontstaan wat heel vervelend is voor de teamleider. Daarom is communicatie waarschijnlijk de belangrijkste basis om de bovengenoemde belangen kunnen garanderen. Hierbij denk ik aan standup meatings, maandelijks en quartaal vergaderingen, personlijke assesments, innovatie avonds, technical meetings enz.

  5. Educatie van Medewerkers
    Geen werkgever zoekt medewerkers zonder interesse. Ook geen werkzoekende zoekt een werkgever zonder kennis. In IT gaat alles over informatie en de manier dat dit kan geleverd worden. Een medewerker wil dus zien hoe slim de projectleider zijn werk doet, en de projectleider wilt zien hoe slim de medewerker problemen aanpakt. aangezien de eisen van de klant groeit exponentieel en gelukkig groeit de technologie ook mee moeten we dus allemaal bijscholen. Dit moet dus van drie kanten gebeuren: interesse, beschikking, awards.

  6. Social Contact
    Dit is de deel dat ik waarschijnlijk beter moet verbergen van mijn vrouw of krijg ik geen kus meer als ik thuis kom :-)
    Het feit is dat ik ieder dag meer mijn werk collega's zie dan mijn vrouw thuis. Dat moet leuk blijven. Hoewell sommige mensen zijn van aard minder sociall dan de rest maar ik heb ondertussen veel geleerd en ik probeer het leven - of zal ik beter noemen het werk- leuker maken voor mijn collega's. Maar dit is een onbereikbaar task, of je moet héél geluk bij hebben om naast juiste mensen gaan zitten. Ik zie het liever vanuit de personeels afdeling mensen die bereid zijn en in geloven dat ze hiervoor iets kunnen betekenen. De tijd voor speukjes als "IT werken is saaai" is al lang voorbij. We bouwen leukste wat men tegenwoordig heeft en dat moet leuk blijven. Ik kies voor leuke mensen om vrijdagavond even praten en borrelen.

Friday, June 11, 2010

Using brackets after any if statement

In my new assignment, where we use .NET 3.5 I got the chance to use the ReSharper extensively. One of the new features I was surprised with is the usage of brackets after every if and else even when they contain simply one statement.
It occurred to me that the debugger stops on the brackets as a step in the processing cycle. So I decided to see what is the difference in the compiled IL code. Therefore I wrote the following code:

public class SeeTheDifference
{
public void Test1()
{
for (int i = 0; i < 10; i++)
{
TestMethod();
}
}
public void Test2()
{
for (int i = 0; i < 10; i++)
TestMethod();
}
private void TestMethod()
{
Debug.WriteLine("test");
}
}

And compiled in both Debug and in Release configuration. The result is the following snapshot in the Reflector:

.method public hidebysig instance void Test1() cil managed
{
.maxstack 2
.locals init (
[0] int32 i,
[1] bool CS$4$0000)
L_0000: nop
L_0001: ldc.i4.0
L_0002: stloc.0
L_0003: br.s L_0012
L_0005: nop
L_0006: ldarg.0
L_0007: call instance void Knowledgebase.SeeTheDifference::TestMethod()
L_000c: nop
L_000d: nop
L_000e: ldloc.0
L_000f: ldc.i4.1
L_0010: add
L_0011: stloc.0
L_0012: ldloc.0
L_0013: ldc.i4.s 10
L_0015: clt
L_0017: stloc.1
L_0018: ldloc.1
L_0019: brtrue.s L_0005
L_001b: ret
}
.method public hidebysig instance void Test2() cil managed
{
.maxstack 2
.locals init (
[0] int32 i,
[1] bool CS$4$0000)
L_0000: nop
L_0001: ldc.i4.0
L_0002: stloc.0
L_0003: br.s L_0010
L_0005: ldarg.0
L_0006: call instance void Knowledgebase.SeeTheDifference::TestMethod()
L_000b: nop
L_000c: ldloc.0
L_000d: ldc.i4.1
L_000e: add
L_000f: stloc.0
L_0010: ldloc.0
L_0011: ldc.i4.s 10
L_0013: clt
L_0015: stloc.1
L_0016: ldloc.1
L_0017: brtrue.s L_0005
L_0019: ret
}


As it is visible in this IL code, there are two nop commands as results of the bracket pair. According to Reflector “nop (0x0000): fills space if bytecodes are patched. No meaningful operation is performed although a processing cycle can be consumed.”

Tuesday, June 1, 2010

Collapse & Expand Code

When I use Visual Studio IDE to edit an XML file, I often come accross a big tree that is not easily to find my way out. So I start to collapse the expanded nodes. Unfortunately it might be very hard to do this.
So I was looking for a macro to do it and found the following macro which I attached a toolbar icon to it:


'' Toggle the current row and go down one line
Sub ToggleOne()
Dim cmd As String = "Edit.ToggleOutliningExpansion"
Dim ts As TextSelection = DTE.ActiveDocument.Selection

DTE.ExecuteCommand(cmd)
ts.LineDown()

End Sub