Eu tenho um controle de usuário que carrego em um MainWindow
tempo de execução. Não consigo identificar a janela que contém o arquivo UserControl
.
Eu tentei this.Parent
, mas é sempre nulo. Alguém sabe como obter um identificador para a janela que contém de um controle de usuário no WPF?
Aqui está como o controle é carregado:
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);
}
Vou adicionar minha experiência. Embora o uso do evento Loaded possa fazer o trabalho, acho que pode ser mais adequado substituir o método OnInitialized. Carregado ocorre depois que a janela é exibida pela primeira vez. OnInitialized oferece a chance de fazer alterações, por exemplo, adicionar controles à janela antes que ela seja renderizada.
fonte
Window.GetWindow
ainda retornanull
emOnInitialized
. Parece funcionar apenas noLoaded
evento.Tente usar VisualTreeHelper.GetParent ou use a função recursiva abaixo para encontrar a janela pai.
fonte
Eu precisava usar o método Window.GetWindow (this) no manipulador de eventos Loaded. Em outras palavras, usei a resposta de Ian Oakes em combinação com a resposta de Alex para obter o pai de um controle de usuário.
fonte
Essa abordagem funcionou para mim, mas não é tão específica quanto sua pergunta:
fonte
Se você está encontrando essa pergunta e o VisualTreeHelper não está funcionando para você ou esporadicamente, pode ser necessário incluir o LogicalTreeHelper no seu algoritmo.
Aqui está o que eu estou usando:
fonte
LogicalTreeHelper.GetParent
no código.Que tal agora:
fonte
Descobri que o pai de um UserControl é sempre nulo no construtor, mas em qualquer manipulador de eventos o pai está definido corretamente. Eu acho que deve ter algo a ver com a maneira como a árvore de controle é carregada. Portanto, para contornar isso, basta obter o pai no evento Controles Carregados.
Para um exemplo de checkout, esta pergunta DataContext do WPF User Control é Nulo
fonte
Outra maneira:
fonte
Está funcionando para mim:
fonte
Isso não funcionou para mim, pois subiu demais na árvore e obteve a janela raiz absoluta para todo o aplicativo:
No entanto, isso funcionou para obter a janela imediata:
fonte
fonte
fonte
Edição banhada a ouro das opções acima (eu preciso de uma função genérica que possa inferir a
Window
dentro do contexto de umaMarkupExtension
: -MyWrapper.Owner()
inferirá corretamente uma janela na seguinte base:Window
percorrendo a árvore visual (se usada no contexto de umUserControl
)Window
marcação de uma)fonte
Diferentes abordagens e estratégias diferentes. No meu caso, não consegui encontrar a janela da minha caixa de diálogo usando o VisualTreeHelper ou os métodos de extensão da Telerik para encontrar o pai de um determinado tipo. Em vez disso, encontrei minha exibição na minha caixa de diálogo, que aceita injeção personalizada de conteúdo usando Application.Current.Windows.
fonte
O
Window.GetWindow(userControl)
retornará a janela real somente após a janela foi inicializado (InitializeComponent()
método acabado).Isso significa que, se o controle do usuário for inicializado junto com a janela (por exemplo, você coloca o controle do usuário no arquivo xaml da janela), no
OnInitialized
evento do controle do usuário você não receberá a janela (será nula), pois causa Nesse caso, o controle do usuárioOnInitialized
evento acionado antes da janela ser inicializada.Isso também significa que, se o controle do usuário for inicializado após a janela, você poderá obter a janela já no construtor do controle do usuário.
fonte
Se você deseja apenas obter um pai específico, não apenas a janela, um pai específico na estrutura da árvore e também não usar contadores de recursão ou loop de interrupção, você pode usar o seguinte:
Apenas não faça essa chamada em um construtor (já que a
Parent
propriedade ainda não foi inicializada). Adicione-o no manipulador de eventos de carregamento ou em outras partes do seu aplicativo.fonte