2016-06-02 3 views
0

In meiner App lade ich einen DocumentViewer zur Vorschau und zum Drucken. Da das Laden einige Sekunden dauern kann, möchte ich einen ProgressDialog anzeigen. Die Logik ist dies: Anzeige ProgressDialog, erstellen und anzeigen DocumentViewer, schließen ProgressDialog.Wie kann ich MahApps ProgressDialog schließen, ohne den Fokus auf Kinderkontrolle zu verlieren?

Das Problem ist, dass beim Schließen des Dialogfelds der Fokus auf das MainWindow zurückkehrt, anstatt in das DocumentViewer-Fenster zu bleiben. Ich denke es liegt an dem Dialog CloseAsync(). Ich habe versucht, Focus(), Activate(), Show() aufzurufen, TopMost = true, den Besitzer des untergeordneten Fensters zu setzen, aber obwohl das Fenster vor dem übergeordneten angezeigt wird, kehrt der Fokus immer noch zu dem übergeordneten zurück . Die einzige Möglichkeit, den Fokus auf das Kind zurückzusetzen, war ein programmatischer Klick innerhalb des untergeordneten Fensters im ProgressDialogController.Closed-Ereignis, aber der Nachteil ist, dass es einen unschönen Übergang gibt (Kind erscheint zuerst im Vordergrund, dann Eltern und dann Kind) nochmal).

Kann CloseAsync() vermieden werden? Oder wie man MahApps ProgressDialog schließt, ohne den Fokus auf Kinderkontrolle zu verlieren?

UPDATE

Ich verwende MahApps 1.3.0.157. Der Code Ich verwende in Ansichtsmodell:

public async void PrintLogExecute() 
    { 
      await DialogService.ShowProgressDialog(Properties.Resources.loading_message_box_title, Properties.Resources.loading_message_box_text); 
      ReportingClass.PrintDataGrid(LogEntries); 
      DialogService.CloseProgressDialog(); 
    } 

Die DialogService Klasse:

static class DialogService 
{ 

    public static async Task ShowProgressDialog(string dialogTitle, string message) 
    { 
     var metroWindow = (GetMainWindow() as MetroWindow); 
     controller = await metroWindow.ShowProgressAsync(dialogTitle, message); 
     controller.SetIndeterminate(); 
    } 

    public static void CloseProgressDialog() 
    { 
     controller.CloseAsync(); 
    } 

    private static Window GetMainWindow() 
    { 
     return Application.Current.Windows[0]; 
    } 
} 

Wenn PrintLogExecute Ausführung() zunächst das Dokument previewer vor dem Hauptfenster angezeigt wird, und unmittelbar danach, wenn Ausführen von DialogService.CloseProgressDialog() geht es in den Hintergrund. Wie ich schon sagte, die einzige Möglichkeit, den Fokus auf das Kind zu setzen, war ein programmatischer Klick innerhalb des Child-Fensters im ProgressDialogController.Closed-Ereignis.

Antwort

0

vielleicht hilft Ihnen das.

<mahApps:MetroWindow x:Class="WakeOnLanV2.MainWindow" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:commands="clr-namespace:WakeOnLanV2.Commands" 
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
        xmlns:mahApps="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" 
        xmlns:viewModels="clr-namespace:WakeOnLanV2.ViewModels" 
        xmlns:views="clr-namespace:WakeOnLanV2.Views" 
        xmlns:wakeOnLan="clr-namespace:WakeOnLanV2" 
        x:Name="MainView" > 
    <Grid> 
     <Grid> 
      <!-- main grid --> 
     </Grid> 

     <mahApps:ProgressRing Width="150" 
           Height="150"         
           Canvas.ZIndex="110"         
           IsActive="{Binding Path=IsBusy, 
               UpdateSourceTrigger=PropertyChanged, 
               FallbackValue=False}" 
           IsLarge="True" /> 

    </Grid> 
</mahApps:MetroWindow> 

Der Ring ist unter dem MainGrid, um es im Vordergrund zu halten.

+0

Vielen Dank für diese Alternative. Allerdings würde ich gerne den ProgressDialog verwenden. –

Verwandte Themen