56 votes

WPF: Comment puis-je configurer la Fenêtre du Propriétaire d'une boîte de Dialogue affichée par un UserControl?

J'ai une application WPF avec ces trois types de choses...

  • WindowMain
  • UserControlZack
  • WindowModal

UserControlZack1 se trouve sur mon WindowMain...

<Window x:Class="WindowMain"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ProjectName"
        ...
        Name="WindowMain">
    <Grid>
        ...
        <local:UserControlZack x:Name="UserControlZack1" ... />
        ...
    </Grid>
</Window>

UserControlZack1 affiche un WindowModal dailog boîte...

Partielle Public Class UserControlZack

...

 Private Sub SomeButton_Click(...)
 'instancier la boîte de dialogue ouvrir modal...
 Dim boîte WindowModal = New WindowModal()
 la boîte.Propriétaire = ?????
la boîte.ShowDialog()
 "traiter les données saisies par l'utilisateur si la boîte de dialogue est accepté...
 Si (boîte.DialogResult.GetValueOrDefault = True), Alors
 _SomeVar = box.SomeVar
...
 Fin De Si
 End Sub

Fin De La Classe

Comment puis-je configurer la boîte.Propriétaire à la bonne Fenêtre, mon instance en cours d'exécution de WindowMain?

Je ne peux pas utiliser box.Owner = Me.Owner, parce que "le" Propriétaire " n'est pas un membre de 'Nom_projet.UserControlZack'."

Je ne peux pas utiliser box.Owner = Me.Parent, parce que renvoie une Grille, pas de la Fenêtre.

Je ne peux pas utiliser box.Owner = WindowMain, parce que "'WindowMain' est un type et ne peut pas être utilisé comme une expression."

127voto

Martin Moser Points 3781

Essayez d'utiliser .Propriétaire = Fenêtre.GetWindow(cet)

42voto

Nir Points 18250

Pour obtenir le niveau supérieur de la fenêtre de votre contrôle, à supposer qu'il y en est un:

(Window)PresentationSource.FromVisual(this).RootVisual

Pour obtenir la fenêtre principale:

Application.Current.MainWindow

8voto

JRL1283 Points 41

1: MyWpfDialog dialogue = new MyWpfDialog();

2:

3: //souvenez-vous, c'est WinForms UserControl et sa Poignée de propriété est

4: //en fait, IntPtr contenant Win32 HWND.

5: nouveau Système.De Windows.Interop.WindowInteropHelper(boîte de dialogue).Propriétaire = ce.La poignée;

6: boîte de dialogue.ShowDialog();

5voto

Andrew Barrett Points 9848

La mise à jour pour aider et essayer de Greg à partir des commentaires. La commande fonctionne dans le menu principal de windows, le bouton dans le contrôle de l'utilisateur et le menu contextuel dans le contrôle de l'utilisateur.

J'aimerais le faire avec les commandes. Donc, avoir une classe de Commandes.cs quelque chose comme:

public static class Commands
{
    public static RoutedUICommand TestShowDialogCommand = new RoutedUICommand("Test command", "TestShowDialog", typeof(Commands));
}

Inscrire ces derniers dans votre fenêtre principale: (vous n'avez pas besoin de la canshow la valeur par défaut à true)

    public Window1()
    {
        InitializeComponent();

        CommandManager.RegisterClassCommandBinding(typeof(System.Windows.Controls.Control),
            new CommandBinding(Commands.TestShowDialogCommand, ShowDialogCommand, CanShowDialogCommand));
    }

    private void ShowDialogCommand(object sender, ExecutedRoutedEventArgs e)
    {
        var box = new Window();
        box.Owner = this;
        box.ShowDialog();

    }

    private void CanShowDialogCommand(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;
    }

C'est mon xaml de la fenêtre principale:

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication1="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="322">
<Grid>
    <StackPanel>
        <Menu>
            <MenuItem Header="Test">
                <MenuItem Header="ShowDialog" Command="{x:Static WpfApplication1:Commands.TestShowDialogCommand}"/>
            </MenuItem>
        </Menu>
        <WpfApplication1:BazUserControl />
    </StackPanel>
</Grid>
</Window>

C'est le xaml pour mon contrôle de l'utilisateur (le code par défaut derrière)

<UserControl x:Class="WpfApplication1.BazUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication1="clr-namespace:WpfApplication1"
Height="300" Width="300">
<Grid>
    <StackPanel>
        <Button Command="{x:Static WpfApplication1:Commands.TestShowDialogCommand}" Content="ClickMe" ></Button>
        <TextBox>
            <TextBox.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="ShowDialog" Command="{x:Static WpfApplication1:Commands.TestShowDialogCommand}" />
                </ContextMenu>
            </TextBox.ContextMenu>
        </TextBox>
    </StackPanel>
</Grid>
</UserControl>

Vous pourriez prendre un peu plus loin et traiter la commande dans une classe de contrôleur de la place et de le rendre un peu plus MVC.

0voto

Zack Peterson Points 19350

Je l'ai eu à travailler par l'analyse de tout le chemin du retour à travers mon XAML...

la boîte.Propriétaire = DirectCast(DirectCast(DirectCast(Me.Parent, De La Grille).Parent, De La Grille).Parent, Fenêtre)

Mais ce qui semble assez peu élégante. Est-il un meilleur moyen?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X