Ivirius
Ivirius

Reputation: 49

UWP create new window for each file opened

I'm trying to make an app open a window for each file.

-- Code ---

App.cs:

    protected async override void OnFileActivated(FileActivatedEventArgs Args)
    {
        //Opens Main Page
        base.OnFileActivated(Args);
        var RF = new Frame();
        var MW = new MainPage();
        AppWindow appWindow = await AppWindow.TryCreateAsync();
        var TB = appWindow.TitleBar;
        RF.Navigate(typeof(MainPage), Args);
        ElementCompositionPreview.SetAppWindowContent(appWindow, RF);
        appWindow.Equals(MW);
        Window.Current.Equals(MW);
        await appWindow.TryShowAsync();
        TB.ButtonHoverBackgroundColor = Colors.White;
        TB.ButtonHoverForegroundColor = Colors.Black;
        TB.ButtonBackgroundColor = Colors.Transparent;
        TB.ButtonPressedBackgroundColor = Colors.WhiteSmoke;
        TB.ButtonPressedForegroundColor = Colors.Black;
        TB.ButtonInactiveBackgroundColor = Colors.Transparent;
        TB.ButtonInactiveForegroundColor = Color.FromArgb(1, 3, 165, 252);
        TB.ExtendsContentIntoTitleBar = true;
        Window.Current.Activate();
    }

MainPage.cs:

    protected override async void OnNavigatedTo(NavigationEventArgs EvArgs)
    {
        //File opened arguments
        base.OnNavigatedTo(EvArgs);
        var Args = EvArgs.Parameter as IActivatedEventArgs;
        var FArgs = Args as FileActivatedEventArgs;
        string Value = GetText(REB);
        string SecValue = GetText(RTB);
        if (Args != null)
        {
            //Check if the app is opened by file
            if (Args.Kind == ActivationKind.File)
            {
                //Set file content
                TXTFile = FArgs.Files[0] as StorageFile;
                if (Value == "")
                {
                    var Str = await TXTFile.OpenReadAsync();
                    ContentDialog ED2 = FileSaveDialog;
                    ED2.PrimaryButtonClick += ED2_PrimaryButtonClick;
                    void ED2_PrimaryButtonClick(ContentDialog Sender, ContentDialogButtonClickEventArgs DialogEvArgs)
                    {
                        //Save the file if it isn't saved
                        Save();
                    }
                    ED2.SecondaryButtonClick += ED2_SecondaryButtonClick;
                    void ED2_SecondaryButtonClick(ContentDialog Sender, ContentDialogButtonClickEventArgs DialogEvArgs)
                    {
                        //Don't save the file
                        //Set document content
                        REB.Document.LoadFromStream(TextSetOptions.FormatRtf, Str);
                        RTB.Document.LoadFromStream(TextSetOptions.FormatRtf, Str);
                        Str.Dispose();
                    }
                    ED2.CloseButtonClick += ED2_CloseButtonClick;
                    void ED2_CloseButtonClick(ContentDialog Sender, ContentDialogButtonClickEventArgs DialogEvArgs)
                    {
                        //Cancel the action
                    }
                    await ED2.ShowAsync();
                    Str.Dispose();
                }
                else
                {
                    //Set document content
                    var Str = await TXTFile.OpenReadAsync();
                    REB.Document.LoadFromStream(TextSetOptions.FormatRtf, Str);
                    RTB.Document.LoadFromStream(TextSetOptions.FormatRtf, Str);
                    Str.Dispose();
                }
            }
        }
        else
        {
            //If there are no arguments, the file, and the RichEditBox should both remain empty 
        }
    }

    public string GetText(RichEditBox RichEditor)
    {
        RichEditor.Document.GetText(TextGetOptions.FormatRtf, out string Text);
        var Range = RichEditor.Document.GetRange(0, Text.Length);
        Range.GetText(TextGetOptions.FormatRtf, out string Value);
        return Value;
    }

Note:

Expected behavior: If the app has a window active with text, the app should open a file on double click in a secondary window. Else, if the text is equal to "", the app should replace it with whatever is in the file.

Actual behavior: The app overrides the text, crashes, makes windows randomly, or creates black windows that can only be killed with Task Manager or Visual Studio

Upvotes: 0

Views: 277

Answers (1)

Roy Li - MSFT
Roy Li - MSFT

Reputation: 8666

I'm not sure what is the file type that you are using so I didn't check the text part. But I have to say that the way you are creating a new window is not correct. If you want to open a new window every time when you open a new file, you don't have to call Window.Current.Activate(); every time. I've made a simple demo that you could check.

In App.xaml.cs:

   protected async override void OnFileActivated(FileActivatedEventArgs args)
    {
        Frame rootFrame = Window.Current.Content as Frame;

        // Do not repeat app initialization when the Window already has content,
        // just ensure that the window is active
        if (rootFrame == null)
        {
            // Create a Frame to act as the navigation context and navigate to the first page
            rootFrame = new Frame();
            // Place the frame in the current Window
            Window.Current.Content = rootFrame;

            rootFrame.Navigate(typeof(MainPage), args.Files);

            Window.Current.Activate();
        }
        else 
        {
            AppWindow appWindow = await AppWindow.TryCreateAsync();

            Frame appWindowContentFrame = new Frame();
            appWindowContentFrame.Navigate(typeof(MainPage),args.Files);

            ElementCompositionPreview.SetAppWindowContent(appWindow, appWindowContentFrame);

            await appWindow.TryShowAsync();
        }
    }

When you launch the app for the first time, you should go through the normal launch process. When the app is launched more than onetime, then you could create a new window with AppWindow.

In MainPage.cs

  protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        // this is the file you need
        var d = e.Parameter;
    }

You could try this code first to make sure that your window is created and shown correctly.

Upvotes: 2

Related Questions