2016-08-27 3 views
1

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

То, что я пытался до сих пор

  • Первоначально я думал, что это будет работать:

    <Window x:Class="WpfApplication3.MainWindow" 
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         Title="MainWindow" Width="200" Height="150" 
         WindowStyle="None" 
         ResizeMode="CanResize" 
         AllowsTransparency="True" 
         BorderThickness="0,5,0,0" 
         BorderBrush="Black"> 
        <Grid Background="Gray" /> 
    </Window> 
    

    Я сделать получить окно только с верхней границей, но я не могу изменить его.

    enter image description here

  • Затем я попытался WindowChrome.ResizeGripDirection="Top" с ResizeMode="CanResizeWithGrip".

    <Window ... 
         WindowStyle="None" 
         ResizeMode="CanResizeWithGrip" 
         AllowsTransparency="True" 
         WindowChrome.ResizeGripDirection="Top" 
         BorderThickness="0,5,0,0" 
         BorderBrush="Black"> 
        ... 
    </Window> 
    

    Это не работает, либо (не может изменить размер от верхней границы), и захват даже не появляется на вершине. Он остается в нижнем правом углу (I может изменить размер с захватом, хотя).

    enter image description here

  • This answer кажется, отвечающего изначально может быть сделано, но код недоступен.

  • This answer имеет ссылку на blog post, я не очень хочу попробовать, потому что я хотел бы получить решение без кода.
  • И тогда есть this answer:

    • Я получаю сообщение об ошибке при таком подходе:

      <Window ... 
           WindowStyle="None" 
           ResizeMode="CanResizeWithGrip" 
           AllowsTransparency="False"> 
          <Grid Background="Gray" /> 
          <Setter Property="WindowChrome.WindowChrome"> 
           <Setter.Value> 
            <WindowChrome CornerRadius="0" 
                GlassFrameThickness="1" 
                UseAeroCaptionButtons="False"/> 
           </Setter.Value> 
          </Setter> 
      </Window> 
      

      Свойство 'Содержание' установлено более одного раза.

    • С кодом позади:

      <Window ... 
           WindowStyle="None" 
           ResizeMode="CanResize" 
           AllowsTransparency="False"> 
          <Grid Background="Gray" /> 
      </Window> 
      

      В конструкторе:

      WindowChrome chrome = new WindowChrome(); 
      chrome.CornerRadius = new CornerRadius(0); 
      chrome.GlassFrameThickness = new Thickness(0, 1, 0, 0); 
      chrome.UseAeroCaptionButtons = false; 
      

      Который дает мне:

      enter image description here

      И это может быть изменен от всех направлениях s. И I только хочу, чтобы иметь возможность изменять размер сверху. (Сюрприз: я даже не назначил новый объект chrome на что-либо. Как это работает? Это другой вопрос, который я предполагаю).


Вопрос

Как сделать полей окно , который может быть изменен только с верхней границы? (Лучше, если я могу сделать это только с верхней границей, цвет которой можно изменить).

ответ

1

Возможно, вам удастся установить свойство WindowChrome.ResizeBorderThickness, чтобы удалить все границы, кроме верхнего, например. ResizeBorderThickness="0, 5, 0, 0".

Это может быть не самым чистым способом достижения вашего результата, но я имел некоторый успех адаптации ответ здесь: http://www.eidias.com/blog/2014/1/27/restyle-your-window (это был самый простой способ я нашел, чтобы получить WindowChrome работает):

Создание пользовательского стиль окна в ResourceDictionary:

<ResourceDictionary x:Class="WpfApplication.WindowStyle" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <Style x:Key="CustomWindowStyle" TargetType="{x:Type Window}"> 
     <Setter Property="WindowChrome.WindowChrome"> 
      <Setter.Value> 
       <WindowChrome CaptionHeight="30" 
           CornerRadius="4" 
           GlassFrameThickness="0" 
           ResizeBorderThickness="0, 5, 0, 0" 
           UseAeroCaptionButtons="False" /> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Window.BorderThickness" Value="0, 5, 0, 0"/
    </Style> 
</ResourceDictionary> 

Ссылка словарь, где требуется (я положил его в App.xaml):

<Application x:Class="WpfApplication1.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication1" 
     StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <ResourceDictionary Source="WindowStyle.xaml" /> 
    </Application.Resources> 
</Application> 

ссылки на стиль в требуемом Window:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:WpfApplication1" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525" 
    Style="{StaticResource ResourceKey=CustomWindowStyle}"> 
    <Grid> 
    </Grid>  
</Window> 

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

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