public ProgramListControl()
        {
            DataContext = this;
            InitializeComponent();

            EventManager.RegisterClassHandler(typeof(MetroWindow), Keyboard.KeyDownEvent, new KeyEventHandler(KeyDown), true);
            SearchBar.ApplyAnimationClock(MarginProperty,
                                          new ThicknessAnimation(new Thickness(10, -40, 10, 0), TimeSpan.FromMilliseconds(10)).CreateClock());

            ProgramItems = new ObservableCollectionView <ProgramItemBase>();
            LoadProgramList();
            ProgramItems.Filter = (x => ((ProgramItemBase)x).ProgramName.ToLower().Contains(_searchString.ToLower()));
            ProgramItems.SortDescriptions.Add(new SortDescription("Favorite", ListSortDirection.Descending));
            ProgramItems.SortDescriptions.Add(new SortDescription("ProgramName", ListSortDirection.Ascending));

            ProgramList.ItemsSource = ProgramItems;

            Application.Current.Exit += SaveProgramList;
        }
 private new void KeyDown(object sender, KeyEventArgs e)
 {
     if (!(Keyboard.FocusedElement is TextBox) || Keyboard.FocusedElement == SearchBar)
     {
         if (e.Key == Key.Escape)
         {
             SearchBar.Text = "";
         }
         Keyboard.Focus(SearchBar);
     }
     else
     {
         SearchBar.ApplyAnimationClock(MarginProperty,
                                       new ThicknessAnimation(new Thickness(10, -40, 10, 0), TimeSpan.FromMilliseconds(350))
         {
             EasingFunction = new SineEase()
         }.CreateClock());
     }
 }