Tengo un control de usuario que cargo en MainWindow
tiempo de ejecución. No puedo obtener un identificador de la ventana que contiene desde el UserControl
.
Lo he intentado this.Parent
, pero siempre es nulo. ¿Alguien sabe cómo obtener un identificador para la ventana que contiene desde un control de usuario en WPF?
Así es como se carga el control:
private void XMLLogViewer_MenuItem_Click(object sender, RoutedEventArgs e)
{
MenuItem application = sender as MenuItem;
string parameter = application.CommandParameter as string;
string controlName = parameter;
if (uxPanel.Children.Count == 0)
{
System.Runtime.Remoting.ObjectHandle instance = Activator.CreateInstance(Assembly.GetExecutingAssembly().FullName, controlName);
UserControl control = instance.Unwrap() as UserControl;
this.LoadControl(control);
}
}
private void LoadControl(UserControl control)
{
if (uxPanel.Children.Count > 0)
{
foreach (UIElement ctrl in uxPanel.Children)
{
if (ctrl.GetType() != control.GetType())
{
this.SetControl(control);
}
}
}
else
{
this.SetControl(control);
}
}
private void SetControl(UserControl control)
{
control.Width = uxPanel.Width;
control.Height = uxPanel.Height;
uxPanel.Children.Add(control);
}
Agregaré mi experiencia. Aunque el uso del evento Loaded puede hacer el trabajo, creo que puede ser más adecuado anular el método OnInitialized. La carga se produce después de que la ventana se muestra por primera vez. OnInitialized le brinda la oportunidad de realizar cambios, por ejemplo, agregar controles a la ventana antes de que se procese.
fuente
Window.GetWindow
Todavía devuelvenull
enOnInitialized
. Parece funcionar solo en elLoaded
evento.Intente usar VisualTreeHelper.GetParent o use la siguiente función recursiva para encontrar la ventana principal.
fuente
Necesitaba usar el método Window.GetWindow (this) dentro del controlador de eventos Loaded. En otras palabras, utilicé la respuesta de Ian Oakes en combinación con la respuesta de Alex para obtener un padre de control de usuario.
fuente
Este enfoque funcionó para mí, pero no es tan específico como su pregunta:
fuente
Si está encontrando esta pregunta y VisualTreeHelper no funciona para usted o no funciona esporádicamente, es posible que deba incluir LogicalTreeHelper en su algoritmo.
Esto es lo que estoy usando:
fuente
LogicalTreeHelper.GetParent
en el código.Qué tal esto:
fuente
Descubrí que el padre de un UserControl siempre es nulo en el constructor, pero en cualquier caso los controladores están configurados correctamente. Supongo que debe tener algo que ver con la forma en que se carga el árbol de control. Entonces, para evitar esto, solo puede obtener el padre en el evento Cargado de controles.
Para ver un ejemplo, consulte esta pregunta el DataContext de WPF User Control es nulo
fuente
De otra manera:
fuente
Me esta funcionando:
fuente
Esto no funcionó para mí, ya que subió demasiado el árbol y obtuvo la ventana raíz absoluta para toda la aplicación:
Sin embargo, esto funcionó para obtener la ventana inmediata:
fuente
fuente
fuente
Edición chapada en oro de lo anterior (necesito una función genérica que pueda inferir a
Window
en el contexto de unMarkupExtension
: -MyWrapper.Owner()
inferirá correctamente una ventana de la siguiente manera:Window
caminando por el árbol visual (si se usa en el contexto de unUserControl
)Window
marcado)fuente
Diferentes enfoques y diferentes estrategias. En mi caso, no pude encontrar la ventana de mi cuadro de diálogo mediante el uso de VisualTreeHelper o los métodos de extensión de Telerik para encontrar el padre del tipo dado. En cambio, encontré mi vista de diálogo que acepta la inyección personalizada de contenido usando Application.Current.Windows.
fuente
El
Window.GetWindow(userControl)
devolverá la ventana real solo después de que la ventana se haya inicializado (InitializeComponent()
método terminado).Esto significa que si su control de usuario se inicializa junto con su ventana (por ejemplo, coloca su control de usuario en el archivo xaml de la ventana), entonces, en el
OnInitialized
evento del control de usuario , no obtendrá la ventana (será nula), porque en ese caso el control del usuarioOnInitialized
evento dispara antes de que se inicialice la ventana.Esto también significa que si su control de usuario se inicializa después de su ventana, puede obtener la ventana ya en el constructor del control de usuario.
fuente
Si solo desea obtener un elemento primario específico, no solo la ventana, un elemento primario específico en la estructura de árbol y también no utiliza contadores de recursión o bucle de ruptura dura, puede usar lo siguiente:
Simplemente no ponga esta llamada en un constructor (ya que la
Parent
propiedad aún no se ha inicializado). Agréguelo en el controlador de eventos de carga o en otras partes de su aplicación.fuente