2012-06-26 8 views
7

estoy usando el siguiente código para mi:PresentationSource.FromVisual (este) devuelve el valor nulo en WPF

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

En algunos sistemas, el valor de "fuente" viene a ser nula y no puedo encontrar la razón por qué ...

Respuesta

7

Creo que tendrá que esperar hasta que se represente la IU hasta que intente asignar el Hwnd. Intente ponerlo en el controlador de eventos para Window.Loaded en su lugar.

Me pasó a mí antes, tuve la tarea Hwnd después de llamar a InitializeComponent() en el constructor del código subyacente. Siempre regresaba nulo, lo que puede detectar cuando entré y vi que la interfaz de usuario aún no había aparecido. Lo inserté en el controlador _Loaded y voila, la interfaz de usuario se renderiza antes de tocar esa línea y, de repente, "esto" dejó de ser nulo.

3

La respuesta de WumpasTamer es correcta. Me gustaría agregar una muestra de código rápido para cualquier otra persona que busque una solución "llave en mano". Si ya está usando WPF, entonces no es necesario window, pero si está usando Winforms y quiere usar PresentationSource, necesitará usar esto.

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

Comenzando con .Net 4.0, puede acceder a HwndSource sin tener que abrir la ventana de primera:

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

todavía me sale nula de '' PresentationSource.FromVisual' después de llamar WindowInteropHelper.EnsureHandle'. Parece que en realidad tengo que mostrar la ventana. 'FromVisual' debe requerir otras cosas internas que se crean de forma perezosa, más allá del mango. –

+0

¿Por qué no usa 'HwndSource.FromHwnd' en su lugar? –

+0

Porque necesito el origen de presentación para acceder al objetivo de composición para acceder a la matriz para acceder a los valores de DPI. –

Cuestiones relacionadas