Wednesday, 8 July 2015

WiX Project Reference Variables

Once a project reference is added, a list of project variables becomes avaliable to be referenced in the WiX source code. Project reference variables are useful when you do not want to have hard-coded values. For example, the $(var.MyProject.ProjectName) variable will query the correct project name at build time even if I change the name of the referenced project after the reference is added.
The following demonstrates how to use project reference variables in WiX source code:

Variable name Example usage Example value
var.ProjectName.Configuration $(var.MyProject.Configuration) Debug or Release
var.ProjectName.FullConfiguration $(var.MyProject.FullConfiguration) Debug|AnyCPU
var.ProjectName.Platform $(var.MyProject.Platform) AnyCPU, Win32, x64 or ia64
var.ProjectName.ProjectDir $(var.MyProject.ProjectDir) C:\users\myusername\Documents\Visual Studio 2010\Projects\MyProject\
var.ProjectName.ProjectExt $(var.MyProject.ProjectExt) .csproj
var.ProjectName.ProjectFileName $(var.MyProject.ProjectFileName) MyProject.csproj
var.ProjectName.ProjectName $(var.MyProject.ProjectName) MyProject
var.ProjectName.ProjectPath $(var.MyProject.ProjectPath) C:\users\myusername\Documents\Visual Studio 2010\Projects\MyProject\MyApp.csproj
var.ProjectName.TargetDir $(var.MyProject.TargetDir) C:\users\myusername\Documents\Visual Studio 2010\Projects\MyProject\bin\Debug\
var.ProjectName.TargetExt $(var.MyProject.TargetExt) .exe
var.ProjectName.TargetFileName $(var.MyProject.TargetFileName) MyProject.exe
var.ProjectName.TargetName $(var.MyProject.TargetName) MyProject
var.ProjectName.TargetPath $(var.MyProject.TargetPath) C:\users\myusername\Documents\Visual Studio 2010\Projects\MyProject\bin\Debug\MyProject.exe
var.ProjectName.Culture.TargetPath $(var.MyProject.en-US.TargetPath) C:\users\myusername\Documents\Visual Studio 2010\Projects\MyProject\bin\Debug\en-US\MyProject.msm
var.SolutionDir $(var.SolutionDir) C:\users\myusername\Documents\Visual Studio 2010\Projects\MySolution\
var.SolutionExt $(var.SolutionExt) .sln
var.SolutionFileName $(var.SolutionFileName) MySolution.sln
var.SolutionName $(var.SolutionName) MySolution
var.SolutionPath $(var.SolutionPath) C:\users\myusername\Documents\Visual Studio 2010\Projects\MySolution\MySolution.sln

Raise an event in a user control and catch it in main window. ( Custom Events, EventArgs and Event Broker )



In this article, Will try to explain how to hook a custom event to an object.  In bit advanced and also create own event arguments that are derived from the EventArgs base class.

Events enable a class or object to notify other classes or objects when something of interest occurs. The class that sends (or raises) the event is called the publisher and the classes that receive (or handle) the event are called subscribers.

Declare event using EventHandler<T> where T is your class that derives from EventArgs:
Different thread

Now take a look into our custom event class:


Class Name : SetHeaderLabelEventArgs

public class SetHeaderLabelEventArgs : EventArgs
{
            public SetHeaderLabelEventArgs(string displayString)
            {
                this.DisplayString = displayString;
            }

            public string DisplayString { get; set; }
}



Event Broker Class 

public static class EventBroker
{
  public static event EventHandler LabelSet; 
  public static void SetHeaderLabel(object sender, {Namespace}.SetHeaderLabelEventArgs e)
  {
    if (LabelSet != null)
       LabelSet(sender, e);
  } 
}



Finally, here it is the object:

Calling Event form One User Control to Event Broker
 
public partial class ucStudent : UserControl
    {
      private void button1_Click(object sender, EventArgs e)
      {

          string displayString = "Header Label";

Namespace.SetHeaderLabelEventArgs args = new    Namespace.SetHeaderLabelEventArgs(displayString);
            EventBroker.SetHeaderLabel(this, args);
    }
}



Main window is listening to Event Broker
public partial class MainWindow : Window
    {
public MainWindow ()
       {
EventBroker.LabelSet -= EventBroker_SetHeader;
EventBroker.LabelSet += EventBroker_SetHeader;
}


private void EventBroker_SetHeader(object userControlName, EventArgs e)
{
Namespace.SetHeaderLabelEventArgs args = (Namespace.SetHeaderLabelEventArgs)e;
MessageBox.Show(args.DisplayString);
}

}