2016-08-04 26 views
0

Ich habe eine WPF-Anwendung, die eine animierte GIF verwendet, um die Aufmerksamkeit des Benutzers kurz zu lenken. Die .gif-Datei befindet sich außerhalb des Fensters meiner App, sodass sie sich unterhalb der Titelleiste befindet.Wie kann ich erzwingen, dass ein Bild in der Titelleiste meiner WPF-Anwendung eingeblendet wird?

Siehe unten:

Gibt es einen Weg, um es zu zwingen, an der Spitze zu überlagern? Es ist in XAML wie folgt definiert:

<Grid> 
    <Image Margin="-5 -45 0 0" DockPanel.Dock="Left" gif:ImageBehavior.AnimatedSource="/Resources/jump.gif" 
      Width="30" RenderTransformOrigin="0.5,0.5"> 
     <Image.RenderTransform> 
      <TransformGroup> 
       <ScaleTransform/> 
       <SkewTransform/> 
       <RotateTransform Angle="45"/> 
       <TranslateTransform/> 
      </TransformGroup> 
     </Image.RenderTransform> 
    </Image> 
</Grid> 

Und es sieht zur Entwurfszeit in Ordnung:

Ich versuchte DockPanel statt Grid als Behälter ohne Erfolg verwenden.

Schließlich ist es möglich, dass es sich so verhält, als wäre es kollabiert? Das heißt, haben sie nicht horizontal Raum zwischen den ComboBox aufzunehmen und der Legende Label

+0

Haben Sie versucht, 'Panel.ZIndex' zu verwenden? –

+0

Ja, es hatte keine Wirkung – Brandon

Antwort

2

Sie benötigen ein Popup so zu verwenden, dass es seinen eigenen Fenstergriff bekommt. Dadurch wird auch kein Platz im Layout benötigt. Als zusätzlichen Bonus (oder vielleicht Kopfschmerzen) können Sie es mit seinen Eigenschaften PlacementTarget und PlacementMode positionieren, da es so aussieht, als ob Sie das sowieso versuchen.

+1

Das gleiche gilt auch für ToolTip –

+0

WPF Popups machen mich traurig. Ich werde nach dem Mittagessen versuchen – Brandon

0

Ich benutzte eine Popup und es funktioniert recht gut, aber mit ein wenig Flimmern.

<Window x:Name="Window1" .../> 
     <Grid> 
     <Button Content="Show" HorizontalAlignment="Left" Margin="160,114,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/> 
     <Button Content="Hide" HorizontalAlignment="Left" Margin="265,114,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_2"/> 
     <Popup x:Name="Popup1" UseLayoutRounding="True" IsOpen="False" Placement="Top" PlacementTarget="{Binding ElementName=Window1}"> 
      <Image Source="C:\\Users\\Public\\Pictures\\Sample Pictures\\desert.jpg" Stretch="Fill" Width="75" Height="25"/> 
     </Popup> 
     </Grid> 
</Window> 

Code:

private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    Popup1.IsOpen = true; 
} 
private void Button_Click_2(object sender, RoutedEventArgs e) 
{ 
    Popup1.IsOpen = false; 
} 

private void Window1_LocationChanged(object sender, EventArgs e) 
{ 
    double offset = Popup1.HorizontalOffset; 
    Popup1.HorizontalOffset = offset + 1; 
    Popup1.HorizontalOffset = offset; 
} 

Ein anderer Ansatz (empfohlen) ohne Popup!

XAML

MainWindow.xaml

<Window x:Class="WpfWindow.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Name="Window1" Title="MainWindow" Height="350" Width="525" 
     Closing="Window1_Closing" Activated="Window1_Activated" LocationChanged="Window1_LocationChanged">  

     <Grid x:Name="root"/> 

</Window> 

TitleBarWindow.xaml

<Window x:Class="WpfWindow.TitleBarWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Topmost="True" 
     Title="TitleBarWindow" AllowsTransparency="True" WindowStyle="None" Height="25" Width="200"> 
    <Grid> 
     <Image Source="g:\\jellyfish.jpg" Stretch="Fill" HorizontalAlignment="Stretch"/> 
    </Grid> 
</Window> 

MainWindow.xaml.cs

namespace WpfWindow 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     TitleBarWindow w = new TitleBarWindow(); 

     public MainWindow() 
     { 
      InitializeComponent(); 

      w.ShowActivated = true; 
      w.Background = Brushes.Red; 
     } 

     private void Window1_LocationChanged(object sender, EventArgs e) 
     { 
      Point pt = Window1.PointToScreen(new Point(0, 0)); 
      w.Top = pt.Y - 27; 
      w.Left = pt.X; 
     }  

     private void Window1_Activated(object sender, EventArgs e) 
     { 
      Point pt = Window1.PointToScreen(new Point(0, 0)); 
      w.Top = pt.Y-27; 
      w.Left = pt.X; 

      w.Show(); 
     } 

     private void Window1_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
     { 
      w.Close(); 
     } 
    } 
} 

Der zweite Ansatz ist sehr gut, funktioniert reibungslos.

+0

Ich denke, das wird funktionieren, aber "PointToScreen" löst eine Ausnahme "Dieses Visual ist nicht mit einer PresentationSource verbunden" – Brandon

+0

es funktioniert 100% in Ordnung ohne Fehler. Doppel-Check-PLZ. – AnjumSKhan

+0

Rufen Sie "PointToScreen" in der Datei "xaml.cs" für "Window1" auf? – Brandon