2013-04-08 5 views
6

Mam okno WPF, które musi zachowywać się jak nakładka okna w uruchomionej aplikacji innej firmy. Moje okno WPF musi być przeważnie przezroczyste, z pewnymi widocznymi kontrolkami, zawsze powinno być umieszczone na górze drugiego okna w kolejności Z, poruszać się z nim itp. Krótko mówiąc: chcę, aby zachowywało się jak okno podrzędne.Okno potomka programu WPF znajdujące się w aplikacji innej firmy niewidoczne w systemie Windows 7 Tematy Aero

Przeglądałem oferowane techniki: here (technika WPF HwndSource) i here (technika WPF SetParent). Technika HwndSource w ogóle nie działa. Technika SetParent działa w systemie Windows 7, ale tylko z podstawowym motywem. Z motywami Windows 7 Aero nie działa: moje okno potomne jest niewidoczne.

Szukam rozwiązania, które będzie działać na wszystkich motywów systemu Windows 7.

Moja aplikacja testowa tworzy okno testowe i wywołuje funkcję SetParent, aby uczynić ją okienkiem podrzędnym okna (o zakodowanym twardym sygnaturce) w oknie Notepad.

ramach podstawowego tematu, to wygląda tak:

Basic Theme

Pod Windows 7 Theme, nie widzę go:

Aero Theme

okna potomnego XAML:

<Window x:Class="WpfApplication22.TestWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="TestWindow" Height="300" Width="300" Background="#63000000" ShowInTaskbar="False" WindowStyle="None" Initialized="Window_Initialized" Loaded="Window_Loaded" AllowsTransparency="True"> 
    <Grid> 
     <Ellipse Height="87" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ellipse1" Stroke="Black" VerticalAlignment="Top" Width="167" Fill="#FFBE3A3A" /> 
    </Grid> 
</Window> 

Kod okna obsługi ładunkowej dziecka:

var parentHwnd = new IntPtr(0x01DE0DFC); // Running Notepad 
    var guestHandle = new WindowInteropHelper(this).Handle; 

    var style = WS_VISIBLE | WS_CLIPSIBLINGS | WS_CHILD | WS_POPUP; 
    SetWindowLong(guestHandle, GWL_STYLE, (int)(style)); 
    SetParent(guestHandle, parentHwnd); 

(Próbowałem odtworzyć styl WS_POPUP. Nie ma to żadnego wpływu.)

+1

Tylko myśl, czy próbowałeś badań z dowolnego okna (słownie calc.exe) inne niż Notatnik? Nie mam teraz dostępu do komputera z systemem Windows 7, ale mogę odtworzyć problem za pomocą notatnika, ale nie za pomocą programu calc.exe, używając dokładnie swojego kodu w systemie Windows 8. W systemie Windows 8 z kodem zostanie wyświetlone okno podrzędne w notatniku , ale gdy tylko aktywuję okno notatnika, okno potomne staje się niewidoczne, więc myślę, że może notatnik robi coś, aby zachować jego pole tekstowe na wszystko inne dzieci. –

+0

Hmmm ... dziękuję za tę myśl, @AndreiPana. Będę testował z innymi oknami i sprawdzę, jak to działa również w systemie Windows 8. –

Odpowiedz

3

Zamiast używać SetParent, ustaw WindowInteropHelper.Owner okna "dziecko" WPF na okno, które chcesz wyświetlić powyżej.

Należy zauważyć, że w .NET 3.5, jeśli zrobisz to w dowolnym programie obsługi zdarzeń "child", nawet już w OnSourceInitialized, właściciel okna tak naprawdę nie zostanie ustawiony. Najwyraźniej jest już za późno, aby ustawić właściciela w tym momencie.

Zamiast tego ustaw właściciela w kodzie, który tworzy okno, zanim zadzwonisz do Show(). .NET 4 wydaje się pozwalać na ustawienie właściciela z poziomu SourceInitialized.

  • Jack
+0

Dziękuję Jack! To działało idealnie. –

+0

Mam podobny problem, ale wygląda na to, że nie mogę uzyskać dostępu do okna Notatnika, tzn. Wywołuję 'this.Owner = HwndSource.FromHwnd (hwnd_notepad) .RootVisual jako Window;'. Jak to osiągnąłeś? – Benj

Powiązane problemy