2012-06-26 12 views
7

Używam następujący kod do mojego:PresentationSource.FromVisual (ta) zwraca wartość null w WPF

protected override void OnSourceInitialized(EventArgs e) 
{ 
... 
.... 
HwndSource source = PresentationSource.FromVisual(this) as HwndSource; 
... 
... 
} 

W niektórych systemach wartość „źródło” wychodzi za nieważne i nie mogę znaleźć przyczyny dlaczego ...

Odpowiedz

7

Myślę, że być może trzeba będzie poczekać, aż interfejs zostanie wyrenderowany, dopóki nie spróbujesz przypisać wartości Hwnd. Spróbuj umieścić go w module obsługi zdarzeń dla Window.Loaded.

To zdarzyło mi się wcześniej, miałem zadanie Hwnd po wywołaniu funkcji InitializeComponent() w konstruktorze kodu z tyłu. Zawsze wracał null, co może wyczuć, kiedy przejrzałem i zobaczyłem, że interfejs jeszcze się nie pojawił. Wrzuciłem go do programu obsługi ładunków pocztowych i voila, interfejs użytkownika renderuje zanim trafi w tę linię i nagle "to" przestało być puste.

3

Odpowiedź WumpasTamer jest prawidłowa. Chciałbym dodać przykład kodu szybkiego dla każdego, kto szuka rozwiązania "pod klucz". Jeśli używasz WPF już wtedy window nie jest konieczne, ale jeśli używasz WinForm i chcesz użyć PresentationSource, będziesz musiał użyć tego.

void Main() 
{ 
    var window = new Window 
    { 
     Width = 0, 
     Height = 0, 
     WindowStyle = WindowStyle.None, 
     ShowInTaskbar = false, 
     ShowActivated = false 
    }; 
    window.Loaded += a_Loaded; 
    window.Show(); 
} 

void a_Loaded(object sender, EventArgs e) 
{ 
    var s = (Window) sender; 
    var source = PresentationSource.FromVisual(s); 
    //... 
    s.Close(); 
} 
3

Począwszy od .NET 4.0, można uzyskać dostęp do HwndSource bez konieczności wykazania przez okno pierwszy:

var helper = new WindowInteropHelper(this); 
var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle()); 
+0

ja wciąż zerowa od 'PresentationSource.FromVisual' po wywołaniu' WindowInteropHelper.EnsureHandle'. Wygląda na to, że muszę pokazać okno. 'FromVisual' musi wymagać innych wewnętrznych rzeczy, które są leniwie tworzone, poza uchwytem. –

+0

Dlaczego zamiast tego nie używasz 'HwndSource.FromHwnd'? –

+0

Ponieważ potrzebuję źródła prezentacji, aby uzyskać dostęp do celu kompozycji, aby uzyskać dostęp do macierzy w celu uzyskania dostępu do wartości DPI. –

Powiązane problemy