Как создать дочернее окно по контекстному меню страницы в wpf? - PullRequest
0 голосов
/ 18 мая 2019

У меня есть контекстное меню, которое вызывается каждым элементом списка.И я хочу создать дочернее окно, когда я выбираю контекстное меню, как показано ниже:

xaml

<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Width="150" Orientation="Vertical" Margin="15, 5, 15, 5">
            <StackPanel.ContextMenu>
                <ContextMenu FontSize="16">
                    <MenuItem Header="{x:Static localRes:Resources.ID_STRING_SETTING}" Margin="5" Command="Setting_Click"/>
                </ContextMenu>

Это уже подстраница главного окна.Итак, я не могу найти способ установить MainWindow экземпляр как владельца нового окна.

За кодом

    private void Setting_Click(object sender, RoutedEventArgs e)
    {
        SettingWindow SettingWindow = new SettingWindow();
        SettingWindow.Owner = /* I do not know how to do */
        SettingWindow.Show();
    }

1 Ответ

1 голос
/ 18 мая 2019

Если ваш обработчик команды click находится в коде позади вашего главного окна, тогда вам нужно установить

deviceSettingWindow.Owner = this;

https://docs.microsoft.com/en-us/dotnet/api/system.windows.window.owner?view=netframework-4.8

Вот небольшой пример. Он включает кнопку с обработчиком, код которого находится в коде позади -

<Window x:Class="MainWindow.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:ChildWindow"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Margin="114,137,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
    </Grid>
</Window>

CodeBehind:

    using System.Windows;
    namespace MainWindow
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }

            private void Button_Click(object sender, RoutedEventArgs e)
            {
                var childWindow = new ChildWindow.Window1();
                childWindow.Owner = this;
                childWindow.Show();
            }
        }
    }

Дочернее окно - просто пустое окно

<Window x:Class="ChildWindow.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ChildWindow"
        mc:Ignorable="d"
        Title="Window1" Height="450" Width="800">
    <Grid>

    </Grid>
</Window>

дочерний код окна позади


using System.Windows;

namespace ChildWindow
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

    }
}

В моем примере, поскольку вы находитесь в коде для MainWindow, this является ссылкой на MainWindow, а установка childWindow.Owner = this устанавливает владельца childWindow на MainWindow, как я полагаю ты хочешь.

Одна вещь, которая немного меня смущает, это то, что вы используете команду и ссылку на обработчик событий в коде. Я уверен, что это не сработает. Команды должны быть привязаны к ссылке на ICommand - вам нужно реализовать свой собственный класс ICommand или использовать один из MVVM Light или другой WPF MVVM Framework. Получив это, вы можете передать ссылку из родительского окна через Command как CommandParameter. Пример того, как это сделать, см. В передаче текущего окна в качестве CommandParameter

.

Если вы используете обработчик событий в элементе управления, то это может привязаться к реализации обработчика событий в коде, как в моем примере. Вам нужно выбрать один или другой.

Если вы сможете предоставить более подробную информацию о том, как вы настраиваете, мне будет проще предоставить информацию о том, в каком направлении вам нужно идти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...