WPF дизайнер запускает процесс - PullRequest
0 голосов
/ 26 ноября 2018

Я делаю приложение direct3d12, для которого я хотел бы написать редактор.Приложение на C ++, но редактор сделан с WPF, из которого я отправляю HWND процессу, который затем создает цепочку обмена на панель WindowsFormsHost.Я запускаю процесс в конструкторе пользовательского элемента управления, который по какой-то причудливой причине запускает процесс, который блокирует исполняемый файл.Как я могу остановить конструктор, чтобы он запускал процесс перед тем, как запустить приложение WPF на самом деле?

public partial class RenderWindow : UserControl
{
    Process AberrationEngine = new Process();
    public RenderWindow()
    {
        InitializeComponent();

    }

    private void UserControl_Unloaded(object sender, RoutedEventArgs e)
    {
        if (!AberrationEngine.HasExited)
        {
            AberrationEngine.Kill();
        }
    }

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        IntPtr HWND = RenderWindowBase.Handle;

        AberrationEngine.StartInfo.FileName = @"C:\Users\nagylas\Desktop\AberrationEngineNextGen\x64\Release\AberrationEngine.exe";
        AberrationEngine.StartInfo.Arguments = "--editor --handle " + HWND.ToString();
        AberrationEngine.StartInfo.UseShellExecute = false;
        AberrationEngine.StartInfo.WorkingDirectory = @"C:\Users\nagylas\Desktop\AberrationEngineNextGen\AberrationEngine";
        AberrationEngine.Start();
    }
}

и XAML

<Window x:Class="AberrationEditor.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:AberrationEditor"
    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
    xmlns:xcad="http://schemas.xceed.com/wpf/xaml/avalondock"
    xmlns:vs2013="clr-namespace:AvalonDock.Themes.VS2013;assembly=AvalonDock.Themes.VS2013"
    xmlns:s="clr-namespace:System;assembly=mscorlib"
    xmlns:brcr="clr-namespace:AberrationEditor.CustomControls"
    mc:Ignorable="d"
    Title="MainWindow" Height="900" Width="1600" Background="#FF2D2D30">
<Window.Resources>
    <Style TargetType="MenuItem">
        <Setter Property="Background" Value="#FF2D2D30" />
        <Setter Property="BorderBrush" Value="#FF2D2D30" />
        <Setter Property="Foreground" Value="LightGray" />
        <Setter Property="BorderThickness" Value="0" />
    </Style>

    <Style TargetType="Separator" x:Key="{x:Static MenuItem.SeparatorStyleKey}">
        <Setter Property="OverridesDefaultStyle" Value="True" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Separator">
                    <Border Background="#FF888888" Height="1" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <StackPanel Orientation="Horizontal">
        <Menu>
            <MenuItem Header="_File">
                <MenuItem Header="_New" />
                <Separator />
                <MenuItem Header="_Exit" />
            </MenuItem>
            <MenuItem Header="_View">
                <MenuItem Header="_New" />
            </MenuItem>
        </Menu>
    </StackPanel>
    <xcad:DockingManager Grid.Row="1" AllowMixedOrientation="True" BorderBrush="Black" BorderThickness="1">
        <xcad:DockingManager.Theme>
            <vs2013:Vs2013DarkTheme/>
        </xcad:DockingManager.Theme>
        <xcad:DockingManager.DocumentHeaderTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Image Source="{Binding IconSource}" Margin="0,0,4,0"/>
                    <TextBlock Text="{Binding Title}" />
                </StackPanel>
            </DataTemplate>
        </xcad:DockingManager.DocumentHeaderTemplate>
        <xcad:LayoutRoot x:Name="_layoutRoot">
            <xcad:LayoutPanel Orientation="Horizontal">
                <xcad:LayoutDocumentPaneGroup >
                    <xcad:LayoutDocumentPane>
                        <xcad:LayoutDocument ContentId="document1" Title="Document 1">
                            <TextBox Text="Document 1 Content" AcceptsReturn="True"/>
                        </xcad:LayoutDocument>
                        <xcad:LayoutDocument ContentId="document2" Title="Document 2">
                            <brcr:RenderWindow></brcr:RenderWindow>
                        </xcad:LayoutDocument>
                    </xcad:LayoutDocumentPane>
                </xcad:LayoutDocumentPaneGroup >
            </xcad:LayoutPanel>
        </xcad:LayoutRoot>
    </xcad:DockingManager>
</Grid>

1 Ответ

0 голосов
/ 26 ноября 2018

Вы, вероятно, должны проверить, если это режим дизайна.Вы можете сделать это с помощью функции DesignerProperties.GetIsInDesignMode.

Документация

Итак, в основном что-то вроде этого:

if (!DesignerProperties.GetIsInDesignMode(this))
{
    //your code running the process
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...