2015-08-02 8 views
1

Я создаю собственное окно WPF с помощью WindowStyle = None, AllowsTransparency = True и ResizeMode = CanMinimize.Панель задач окна WPF

У меня есть два события (которые я создал для понимания событий в WPF), PreviewMouseDoubleClick и PreviewMouseMove.

Вот XAML:

<Style TargetType="{x:Type local:CustomWindow}"> 
    <Setter Property="WindowStyle" Value="None"/> 
    <Setter Property="AllowsTransparency" Value="True"/> 
    <Setter Property="ResizeMode" Value="CanMinimize"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:CustomWindow}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}"> 
        <Grid Background="{TemplateBinding GridBackground}"> 
         <ContentPresenter/> 
        </Grid> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Вот код Сзади:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Input; 
using System.Windows.Media; 

namespace CustomWindows 
{ 
    public class CustomWindow : Window 
    { 
     /* Dependency properties */ 


     public Brush GridBackground 
     { 
      get { return (Brush)GetValue(GridBackgroundProperty); } 
      set { SetValue(GridBackgroundProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for GridBackground. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty GridBackgroundProperty = 
      DependencyProperty.Register("GridBackground", typeof(Brush), typeof(Window), new PropertyMetadata(null)); 




     /* Constructors */ 

     static CustomWindow() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomWindow), new FrameworkPropertyMetadata(typeof(CustomWindow))); 
     } 



     /* overriders */ 

     public override void OnApplyTemplate() 
     { 
      PreviewMouseDoubleClick += (s, e) => 
      { 
       WindowState = (WindowState == WindowState.Maximized) ? WindowState.Normal : WindowState.Maximized; 
      }; 

      PreviewMouseMove += (s, e) => 
      { 
       if(Mouse.LeftButton == MouseButtonState.Pressed) 
       { 
        DragMove(); 
       } 
      }; 

      base.OnApplyTemplate(); 
     } 
    } 
} 

На Перетаскивание это окно, оно охватывает панель задач. Я не уверен, почему. Вот ссылка на изображении, которое описывает поведение я говорю: http://imgur.com/ba3ADoLIssue Description Image

Также на восстановление окна, если указатель мыши находится вне границ окна, фокус еще не дан Desktop , Если мышь перемещается вручную немного позже. Основное внимание уделяется Desktop. Такое поведение кажется мне странным. Любая помощь будет оценена.

Спасибо заранее.

ответ

0

Я предпочел бы использовать класс WindowChrome в ответ на dss539 по адресу: How to create custom window chrome in wpf?

.NET 4.5 добавлен новый класс, который значительно упрощает это.

Класс WindowChrome позволяет расширить содержимое Windows Presentation Foundation (WPF) в неклиентской области окна, которое обычно резервируется для оконного менеджера операционной системы.

Вы можете найти учебное пособие here.

И вот краткий пример usage.

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