Pages

Friday, December 27, 2013

Visio 2013 fill color problem

Recently there was a huge change in my professional life. I`ve moved to another city and found a new job. If for my previous employment I was working on WinForms application (and mostly on Visio integration into it) then now I am a back-end (mostly) web developer. So the focus of my posts will be moved to web questions and solutions.

But for now I want to post my last (probably) note about Visio. One of the problems I faced with Visio 2013 was introduction of the FillGradientEnabled param. Here is a link on MSDN. There is nothing special about it but it interfere  with a common way of filling with FillColor. If you will try to fill a shape with setting FillColor to some value it wont show if the FillGradientEnabled is there and is not False. It took a little for me to figure it out. The special case was with Organisational Chart shapes, as all of them from Visio 2013 have that property inherited from the theme...

So for me the solution was to check if that property is there, and in that case set it to false. After it FillColor worked as before!

Binding enum to WPF combobox

Many times I found myself binding combobox to a set of values. A common scenario is that those values are just strings - representation of a application state, so creation of a static collection of strings was not very attractive for me. Enums are naturally fit in this scenario. But how to bind combobox to the enum? To comfortably bind enum its items should have descriptions - they will be used as a values for combobox. But here is a small helper to do this:
public static class EnumHelper
{
  public static string Description(this Enum eValue)
  {
    var nAttributes = eValue.GetType().GetField(eValue.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false);

    if (!nAttributes.Any())
      return eValue.ToString();

    var descriptionAttribute = nAttributes.First() as DescriptionAttribute;
    if (descriptionAttribute != null)
      return descriptionAttribute.Description;

    return eValue.ToString();
  }

  public static IEnumerable<KeyValuePair<Enum, string>> GetAllValuesAndDescriptions<TEnum>() where TEnum : struct, IConvertible, IComparable, IFormattable
  {
    if (!typeof(TEnum).IsEnum)
      throw new ArgumentException("TEnum must be an Enumeration type");

    return from e in Enum.GetValues(typeof(TEnum)).Cast<Enum>()
           select new KeyValuePair<Enum, string>(e, e.Description());
  }
}


public enum WorkModes
{
  [Description("Simple mode")]
  Simple,
  [Description("Complex mode")]
  Complex,
  [Description("Third (optional) option")]
  Etc
}

//from windows loaded event - bind itemsSource of combobox to enum.
//and set it to default value
private void Window_Loaded(object sender, RoutedEventArgs e)
{
  cbCurrentState.ItemsSource = EnumHelper.GetAllValuesAndDescriptions();
  cbCurrentState.SelectedIndex = 0;
}

//And combo box declaration: