2016-08-04 2 views
0

У меня есть приложение WPF, у которого есть анимированный .gif, используемый для кратковременного привлечения внимания пользователей. Файл .gif находится за пределами окна моего приложения, так что он находится под ним и покрывается заголовком.Как заставить изображение накладываться на строку заголовка моего приложения WPF?

Смотрите ниже:

Есть ли способ, чтобы заставить его накладывать сверху? Это определено в XAML как это:

<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> 

И это выглядит хорошо во время разработки:

Я попытался с помощью DockPanel вместо Grid в качестве контейнера не увенчались успехом.

И, наконец, возможно ли, что он ведет себя так, как будто он рухнул? То есть, не занимайте горизонтальное пространство между ComboBox и Legend Label

+0

Вы пытались использовать 'Panel.ZIndex'? –

+0

Да, это не повлияло – Brandon

ответ

2

Вам необходимо использовать Popup, чтобы он получил свой собственный дескриптор окна. Это также заставляет не занимать места в макете. В качестве дополнительного бонуса (или, возможно, головной боли) вы сможете разместить его со своими PlacementTarget и PlacementMode свойствами, так как похоже, что вы все равно пытаетесь это сделать.

+1

То же самое применимо и к ToolTip –

+0

Всплывающие окна WPF меня огорчают. Я попробую после обеда – Brandon

0

Я использовал Popup, и он работает достаточно хорошо, но с очень маленьким мерцанием.

<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> 

Код:

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; 
} 

Другой подход (рекомендуется) без всплывающего окна!

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(); 
     } 
    } 
} 

Второй подход очень хорош, работает плавно.

+0

Я думаю, что это сработает, но «PointToScreen» выдает исключение «Этот Visual не подключен к PresentationSource» – Brandon

+0

работает на 100% без ошибок. двойная проверка plz. – AnjumSKhan

+0

Вы вызываете 'PointToScreen' в xaml.cs для' Window1'? – Brandon

Смежные вопросы