2010-06-03 4 views
31

Używam WPF Shell Integration Library do tworzenia niestandardowego chrome mojej aplikacji wpf. Wszystko jest w porządku, ale przy maksymalizacji aplikacji 6 lub 7 pikseli jest poza ekranem.Okno z ekranu po zmaksymalizowaniu za pomocą biblioteki integracji powłoki WPF

Jest to kod używam:

<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

Występuje to również podczas korzystania z 'System.Windows.Shell.Klasa WindowChrome' (wspomniany tu pakiet NuGet nie jest już potrzebny, ponieważ ta klasa jest teraz wbudowana w 'PresentationFramework.dll'). –

Odpowiedz

42

Okna crops krawędzi okna, gdy jest zmaksymalizowane przesłonić tego, co normalnie byłoby krawędzie zmienić. Możesz obejść to, umieszczając granicę proxy między oknem a treścią, a następnie zwiększając grubość, gdy jest zmaksymalizowana.

zmodyfikowałem przykład dostarczonej z lib to zrobić, te same podstawowe zmiana może być wykonane do próbki:

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

Mam nadzieję, że pomaga.

dla .NET 4.5 i powyżej, z SystemParameters są nieco inne, np:

<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, tak piękne rozwiązanie. Dlaczego nie sprawdziłem StackOverflow przed rozpoczęciem pisania mojego brzydkiego kodu? –

+3

Zmieniłem na '', aby działało, nie wiem dlaczego –

+0

To lepsze niż to, co zrobiłem. Po prostu zdarzyło mi się, że okno było nazwane, więc mogłem w ten sposób odnieść się do tego w moim przypadku. –

5

ten pracował dla mnie:

<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

Od here, pomyślałem Chciałbym ustawić WindowChrome.NonClientFrameEdges.

Przy niektórych eksperymentach okazuje się, że można uzyskać pożądany efekt, ustawiając go na NonClientFrameEdges.Bottom po zmaksymalizowaniu i ustawiając go ponownie na NonClientFrameEdges.None, gdy nie jest on zmaksymalizowany.

Powoduje to, że margines znika na wszystkich krawędziach z wyjątkiem dolnej, ale powoduje, że nakładanie się pod paskiem zadań nie ma już miejsca.

Ważne jest, że WindowChrome jest ustawiony przed do WindowState, więc w moim kodu źródłowego Mam funkcji (MainGrid2 trzyma całą zawartość okna blokowania paska stanu, a StatusGrid posiada pasek stanu):

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

Aby rozwiązać ten problem okna wychodzi z ekranu po prostu ustawić:

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

Zobacz JAPF's "Set up the main window of your WPF project" post aby uzyskać więcej informacji.

+2

To rozwiązanie sprawdziło się i uznałem to za najprostsze +1 –

+0

To po prostu głupie, to nie można zmienić rozmiaru ani wyświetlić na pełnym ekranie okna – Wobbles

0

W moim projekcie mam CaptionHeight ustawioną na 0, a ResizeMode na CanResizeWithGrip. To jest kod, który wymyśliłem dla właściwej grubości.

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

Ja tylko zamiar użyć granicę jak Joe Castro nie, a następnie związać grubości do nieruchomości, które można zaktualizować, gdy zmiany stanu okno.

Kod wydaje się być jankowy, ale jeszcze nie znalazłem innego rozwiązania.

+0

Jeśli odwołasz się do innej odpowiedzi z twojej odpowiedzi, rozważ powiązanie do niego lub włączenie jego części (z atrybutem), aby odpowiedź była kompletna. –

Powiązane problemy