2010-06-03 2 views
31

J'utilise le WPF Shell Integration Library pour créer un chrome personnalisé de mon application wpf. Tout est bon, mais lors de la maximisation de l'application, 6 ou 7 pixels sont hors de l'écran.Fenêtre hors de l'écran lorsqu'elle est agrandie à l'aide de la bibliothèque d'intégration de shell WPF

Ce code J'utilise:

<Style TargetType="{x:Type local:MainWindow}"> 
     <Setter Property="shell:WindowChrome.WindowChrome"> 
      <Setter.Value> 
       <shell:WindowChrome 
        ResizeBorderThickness="6" 
        CaptionHeight="10" 
        CornerRadius="0" 
        GlassFrameThickness="1"/> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:MainWindow}"> 
        <Grid> 
         <Border BorderThickness="1" BorderBrush="#389FD1" Background="#389FD1"> 
          <ContentPresenter Margin="0,22,0,0" Content="{TemplateBinding Content}"/> 
         </Border> 
         <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Top" > 
          <TextBlock Text="{Binding NombreUsuario}" Foreground="White" Margin="5,5,20,5" Opacity=".8" /> 
          <Button Style="{StaticResource ImageButton}" Height="20" Width="20" Margin="0" Click="WindowMinimize" shell:WindowChrome.IsHitTestVisibleInChrome="True"> 
           <Image Height="10" Width="10" Source="/Resources/Images/minimize.png" /> 
          </Button> 
          <Button Style="{StaticResource ImageButton}" Height="20" Width="20" Margin="0" Click="WindowMaximizeRestore" shell:WindowChrome.IsHitTestVisibleInChrome="True" > 
           <Image Height="10" Width="10" Source="/Resources/Images/maximize.png" /> 
          </Button> 
          <Button Style="{StaticResource ImageButton}" Height="20" Width="20" Margin="0" Click="WindowClose" shell:WindowChrome.IsHitTestVisibleInChrome="True"> 
           <Image Height="10" Width="10" Source="/Resources/Images/close.png" /> 
          </Button> 
         </StackPanel> 

        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+0

Cela se produit également lors de l'utilisation de 'System.Windows.Shell.WindowChrome' class (le paquet NuGet auquel il est fait référence ici n'est plus nécessaire car cette classe est maintenant intégrée dans 'PresentationFramework.dll'). –

Répondre

42

de Windows cultures les bords de la fenêtre lorsqu'elle est maximisée à obscurcir ce qui serait normalement les bords resize. Vous pouvez contourner cela en mettant une frontière de proxy entre la fenêtre et votre contenu, puis gonfler l'épaisseur lorsqu'il est agrandi.

J'ai modifié l'exemple qui est venu avec la lib pour ce faire, le même changement de base pourrait être à votre échantillon:

<ControlTemplate TargetType="{x:Type local:SelectableChromeWindow}"> 
    <Border BorderBrush="Green"> 
    <Border.Style> 
     <Style TargetType="{x:Type Border}"> 
     <Setter Property="BorderThickness" Value="0"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ElementName=ThisWindow, Path=WindowState}" Value="Maximized"> 
      <Setter Property="BorderThickness" Value="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=WindowResizeBorderThickness}"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </Border.Style> 
    <Grid [...]/> 
    </Border> 
</ControlTemplate> 

J'espère que cela aide.

Pour .net 4.5 et au-dessus, les SystemParameters sont un peu différentes, par exemple:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MainWindow}}, Path=WindowState}" Value="Maximized"> 
    <Setter Property="BorderThickness" Value="{Binding Source={x:Static SystemParameters.WindowResizeBorderThickness}}"/> 
</DataTrigger> 
+3

OMG, si belle solution. Pourquoi n'ai-je pas vérifié StackOverflow avant de commencer à taper mon code moche? –

+3

J'ai changé pour '' pour le faire fonctionner, je ne sais pas pourquoi –

+0

C'est mieux que ce que j'ai fait. Je viens d'avoir nommé la Fenêtre pour que je puisse y faire référence dans mon cas. –

5

cela a fonctionné pour moi:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell" 
       xmlns:Views="clr-namespace:BorderLessWpf.Views"> 

<Style TargetType="{x:Type Views:ShellView}" > 
    <Setter Property="shell:WindowChrome.WindowChrome"> 
     <Setter.Value> 
      <shell:WindowChrome 
       ResizeBorderThickness="6" 
       CaptionHeight="10" 
       CornerRadius="0" 
       GlassFrameThickness="1"/> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="WindowState" Value="Maximized"> 
      <Setter Property="BorderThickness" Value="6" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

1

De here, je pensais Je voudrais essayer WindowChrome.NonClientFrameEdges. Avec quelques expériences, il s'avère que vous pouvez obtenir l'effet désiré en le réglant sur NonClientFrameEdges.Bottom lorsqu'il est agrandi, et en le remettant à NonClientFrameEdges.None lorsqu'il n'est pas agrandi.

Cela fait disparaître la marge sur tous les bords à l'exception du fond, mais empêche le chevauchement sous la barre des tâches.

Il est important que le WindowChrome est mis avant la WindowState, donc dans mon code-behind je les fonctions (MainGrid2 détient tout le contenu de la fenêtre sauf la barre d'état, et StatusGrid détient la barre d'état):

private void Maximise() 
    { 
     StatusGrid.Margin = new Thickness(7, 0, 7, 0); 
     MainGrid2.Margin = new Thickness(12, 12, 12, 0);    
     chrome.NonClientFrameEdges = NonClientFrameEdges.Bottom; 
     WindowChrome.SetWindowChrome(this, chrome); 
     WindowState = System.Windows.WindowState.Maximized; 
    } 

    private void Restore() 
    { 
     StatusGrid.Margin = new Thickness(0); 
     MainGrid2.Margin = new Thickness(5, 5, 5, 0); 
     chrome.NonClientFrameEdges = NonClientFrameEdges.None; 
     WindowChrome.SetWindowChrome(this, chrome); 
     WindowState = System.Windows.WindowState.Normal; 
    } 
2

pour résoudre la question de la fenêtre sortir de l'écran suffit de définir:

this.ResizeMode = System.Windows.ResizeMode.NoResize; 

Voir JAPF's "Set up the main window of your WPF project" post pour plus d'informations.

+2

Cette solution a fonctionné pour moi et je l'ai trouvée la plus simple: +1 –

+0

C'est juste idiot, alors vous ne pouvez pas redimensionner ou plein écran la fenêtre – Wobbles

0

Dans mon projet, j'ai CaptionHeight défini sur 0 et ResizeMode défini sur CanResizeWithGrip. C'est le code que j'ai trouvé pour la bonne épaisseur.

  Thickness maximizeFix = new Thickness(SystemParameters.WindowNonClientFrameThickness.Left + 
       SystemParameters.WindowResizeBorderThickness.Left, 
       SystemParameters.WindowNonClientFrameThickness.Top + 
       SystemParameters.WindowResizeBorderThickness.Top 
       - SystemParameters.CaptionHeight, 
       SystemParameters.WindowNonClientFrameThickness.Right + 
       SystemParameters.WindowResizeBorderThickness.Right, 
       SystemParameters.WindowNonClientFrameThickness.Bottom + 
       SystemParameters.WindowResizeBorderThickness.Bottom); 

Je vais juste utiliser une frontière comme Joe Castro ne puis liez l'épaisseur à une propriété que je mettre à jour lorsque les changements d'état de la fenêtre.

Le code semble janky mais je n'ai pas encore trouvé une autre solution.

+0

Si vous faites référence à une autre réponse de votre réponse, pensez à relier ou d'en incorporer une partie (avec attribution) pour compléter votre réponse. –

Questions connexes