Another Balloon Tip Implementation
Originally Published inAlexander Ignatovich, or Игнатович Александр, responds to the recent discussion on using balloon tips in Revit and says:
I want to share another solution for balloon tips for custom messages, without using the unsupported AdWindows library.
Just see the project attached in YetAnotherBalloonTip.zip :-)
Alexander’s solution provides three different sample commands:
- Simple balloon
- Warning balloon
- Balloon from another thread
The implementation is packaged in a separate self-contained class named NotifyBox, so instantiating a simple balloon tip is really very simple indeed, in one single constructor call:
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using IVC.NotifyBox.Controls;
using IVC.NotifyBox.ViewModel.Enums;
namespace YetAnotherBaloons
{
[Transaction( TransactionMode.Manual )]
public class StartSimpleBaloonCommand : IExternalCommand
{
public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements )
{
NotifyBox.Show( "Hello", "Hello from "
+ "Investicionnaya Venchurnaya Companiya ;-)",
NotificationDuration.Short );
return Result.Succeeded;
}
}
}
An argument enables you to specify the duration.
The resulting balloon tip looks like this, and fades away after a moment:
Another argument allows you to specify an icon, e.g. to implement a warning balloon tip:
public class StartWarningBaloonCommand : IExternalCommand
{
public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements )
{
NotifyBox.Show( "Warning",
"Warning! Something is not perfect :)",
NotificationIcon.Warning,
NotificationDuration.Medium );
return Result.Succeeded;
}
}
The resulting balloon tip includes an icon:
Since the balloon tip class is completely independent of Revit, it can obviously be called from a different thread as well:
public class StartBaloonFromAnotherThreadCommand : IExternalCommand
{
public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements )
{
System.Threading.Tasks.Task.Factory.StartNew( () =>
{
Thread.Sleep( TimeSpan.FromSeconds( 3 ) );
NotifyBox.Show( "Warning",
"This message is from another thread!",
NotificationIcon.Warning,
NotificationDuration.Medium );
} );
return Result.Succeeded;
}
}
Many thanks to Alexander for sharing this!