Blog (220)
Komentarze (4k)
Recenzje (1)

Hakujemy Visual Studio — dobieramy się do niedostępnych elementów IDE

@djfoxerHakujemy Visual Studio — dobieramy się do niedostępnych elementów IDE27.03.2017 20:26

API udostępnione przez SDK do Visual Studio pozwala na olbrzymie zmiany w IDE. Niestety nie zawsze to co chcemy zrobić jest możliwe w oficjalny sposób. W tym wpisie przedstawię sposób na modyfikowanie elementów interfejsu Visual Studio, które nie są możliwe poprzez API. Będziemy hakowali Visuala :)

API do Visual Studio - mnogość możliwość, ale jednak z ograniczeniami

Ilość elementów, jakie można rozszerzać może spowodować zagubienie na samym początku. Programiści mogą przy pomocy SDK modyfikować niemalże wszystko od dodania menu, poprzez własny edytor, na customowym, dostosowanym do konkretnych potrzeb nowym IDE kończąc.

Jednakże udostępnione API nie pozwala na duże ingerencje w każdym aspekcie. Chociażby pasek statusu na dole ma niemalże zerowe możliwości rozbudowy. Nie jest to jednak przeszkodą dla programistów .NET...

Visual Studio też jest aplikacją WPF

Podejdźmy jednak do IDE od Microsoftu z innej strony. Powłoka Visual Studio w wersji 2010 została całkowicie przepisana na WPF. Użyto również MEF (opis we wcześniejszym wpisie ) jako frameworku do pisania rozszerzeń i bazy pod nową odsłonę edytora.

Taka wiedza pozwoli nam na zaprzęgniecie do pracy narzędzi, które analizują strukturę drzewa UI aplikacji napisanych w WPF. W prosty sposób przejrzymy budowę programu i rozszerzymy go o nowe elementy. Bez oficjalnego API dobierzemy się do każdego elementu i rozbudujemy IDE o własne kontrolki. Jednym z takich narzędzi jest...

Snoop, the WPF Spy Utility

Snoop jest świetnym narzędziem do wizualizacji warstw elementów graficznych w aplikacji WPF. Potrafi ono analizować dynamicznie strukturę kontrolek w uruchomionej aplikacji. Wystarczy kursorem wskazać program i można już przechodzić po drzewie elementów.

Snoop posiada także ciekawy wizualizator warstw w analizowanej aplikacji.

Program na żywo pokazuje całą strukturę widoku, pozwala to na szybki podgląd ułożenia poszczególnych elementów z właściwościami, DataContextem, eventami i metodami. Co ważne umożliwia on zmianę tych danych w locie.

Dobieramy się do niedostępnych elementów Visual Studio

Jak zatem rozszerzyć IDE o własne kontrolki? Wystarczy z poziomu Snoopa znaleźć interesujący nas element i zapamiętać jego nazwę oraz typ. Dla przykładu rozszerzymy o własną kontrolkę dolny pasek w Visual Studio, StatusBar:

Następnie w C# wyszukamy go dynamicznie przy pomocy VisualTreeHelper'a. Użyjemy do tego kodu ze StackOverflow :


public static T FindChild<T>(DependencyObject parent, string childName)
   where T : DependencyObject
{    
  // Confirm parent and childName are valid. 
  if (parent == null) return null;

  T foundChild = null;

  int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
  for (int i = 0; i < childrenCount; i++)
  {
    var child = VisualTreeHelper.GetChild(parent, i);
    // If the child is not of the request child type child
    T childType = child as T;
    if (childType == null)
    {
      // recursively drill down the tree
      foundChild = FindChild<T>(child, childName);

      // If the child is found, break so we do not overwrite the found child. 
      if (foundChild != null) break;
    }
    else if (!string.IsNullOrEmpty(childName))
    {
      var frameworkElement = child as FrameworkElement;
      // If the child's name is set for search
      if (frameworkElement != null && frameworkElement.Name == childName)
      {
        // if the child's name is of the request name
        foundChild = (T)child;
        break;
      }
    }
    else
    {
      // child element found.
      foundChild = (T)child;
      break;
    }
  }

  return foundChild;
}

W naszym kodzie wtyczki pobranie StatusBara z Visual Studio wyglądać będzie tak:


var statusBarObj = UIHelper.FindChildControl<DockPanel>(
Application.Current.MainWindow,"StatusBarPanel");

Dodajmy teraz jeszcze jakiś dowolny przycisk, aby pokazać, że faktycznie dobraliśmy się bezpośrednio do paska statusu:


var button = new Button();
button.Content = "Klikamy!";
statusBarObj.Children.Insert(0, button);

Oto efekt końcowy, niemożliwe stało się możliwe:

W kolejnym wpisie wykorzystamy zdobytą wiedzę do wyświetlenia timera na pasku statusu!

Szanowna Użytkowniczko! Szanowny Użytkowniku!
×
Aby dalej móc dostarczać coraz lepsze materiały redakcyjne i udostępniać coraz lepsze usługi, potrzebujemy zgody na dopasowanie treści marketingowych do Twojego zachowania. Twoje dane są u nas bezpieczne, a zgodę możesz wycofać w każdej chwili na podstronie polityka prywatności.

Kliknij "PRZECHODZĘ DO SERWISU" lub na symbol "X" w górnym rogu tej planszy, jeżeli zgadzasz się na przetwarzanie przez Wirtualną Polskę i naszych Zaufanych Partnerów Twoich danych osobowych, zbieranych w ramach korzystania przez Ciebie z usług, portali i serwisów internetowych Wirtualnej Polski (w tym danych zapisywanych w plikach cookies) w celach marketingowych realizowanych na zlecenie naszych Zaufanych Partnerów. Jeśli nie zgadzasz się na przetwarzanie Twoich danych osobowych skorzystaj z ustawień w polityce prywatności. Zgoda jest dobrowolna i możesz ją w dowolnym momencie wycofać zmieniając ustawienia w polityce prywatności (w której znajdziesz odpowiedzi na wszystkie pytania związane z przetwarzaniem Twoich danych osobowych).

Od 25 maja 2018 roku obowiązuje Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 (określane jako "RODO"). W związku z tym chcielibyśmy poinformować o przetwarzaniu Twoich danych oraz zasadach, na jakich odbywa się to po dniu 25 maja 2018 roku.

Kto będzie administratorem Twoich danych?

Administratorami Twoich danych będzie Wirtualna Polska Media Spółka Akcyjna z siedzibą w Warszawie, oraz pozostałe spółki z grupy Wirtualna Polska, jak również nasi Zaufani Partnerzy, z którymi stale współpracujemy. Szczegółowe informacje dotyczące administratorów znajdują się w polityce prywatności.

O jakich danych mówimy?

Chodzi o dane osobowe, które są zbierane w ramach korzystania przez Ciebie z naszych usług, portali i serwisów internetowych udostępnianych przez Wirtualną Polskę, w tym zapisywanych w plikach cookies, które są instalowane na naszych stronach przez Wirtualną Polskę oraz naszych Zaufanych Partnerów.

Dlaczego chcemy przetwarzać Twoje dane?

Przetwarzamy je dostarczać coraz lepsze materiały redakcyjne, dopasować ich tematykę do Twoich zainteresowań, tworzyć portale i serwisy internetowe, z których będziesz korzystać z przyjemnością, zapewniać większe bezpieczeństwo usług, udoskonalać nasze usługi i maksymalnie dopasować je do Twoich zainteresowań, pokazywać reklamy dopasowane do Twoich potrzeb. Szczegółowe informacje dotyczące celów przetwarzania Twoich danych znajdują się w polityce prywatności.

Komu możemy przekazać dane?

Twoje dane możemy przekazywać podmiotom przetwarzającym je na nasze zlecenie oraz podmiotom uprawnionym do uzyskania danych na podstawie obowiązującego prawa – oczywiście tylko, gdy wystąpią z żądaniem w oparciu o stosowną podstawę prawną.

Jakie masz prawa w stosunku do Twoich danych?

Masz prawo żądania dostępu, sprostowania, usunięcia lub ograniczenia przetwarzania danych. Możesz wycofać zgodę na przetwarzanie, zgłosić sprzeciw oraz skorzystać z innych praw wymienionych szczegółowo w polityce prywatności.

Jakie są podstawy prawne przetwarzania Twoich danych?

Podstawą prawną przetwarzania Twoich danych w celu świadczenia usług jest niezbędność do wykonania umów o ich świadczenie (tymi umowami są zazwyczaj regulaminy). Podstawą prawną przetwarzania danych w celu pomiarów statystycznych i marketingu własnego administratorów jest tzw. uzasadniony interes administratora. Przetwarzanie Twoich danych w celach marketingowych realizowanych przez Wirtualną Polskę na zlecenie Zaufanych Partnerów i bezpośrednio przez Zaufanych Partnerów będzie odbywać się na podstawie Twojej dobrowolnej zgody.