Как создать окно WPF без границы, размер которого можно изменить только с помощью ручки?



Если вы установите ResizeMode="CanResizeWithGrip" на WPF Window, то в правом нижнем углу появится ручка изменения размера, как показано ниже:





Если вы также установите WindowStyle="None", строка заголовка исчезнет, но серый скошенный край останется до тех пор, пока вы не установите ResizeMode="NoResize". К сожалению, при таком сочетании свойств ручка изменения размера также исчезает.



Я переопределил Window's ControlTemplate через пользовательский Style. Я хочу сам указать границу окна, и мне не нужно, чтобы пользователи могли изменять размер окно со всех четырех сторон, но мне нужна ручка для изменения размера.



Может ли кто-нибудь подробно описать простой способ удовлетворения всем этим критериям?



  1. не имеют границы на Window кроме той, которую я указываю сам в ControlTemplate.


  2. У есть рабочая ручка изменения размера в правом нижнем углу.


  3. не имеют строки заголовка.

710   4  

4 ответов:

Если вы установите свойство AllowsTransparency на Window (даже без установки каких-либо значений прозрачности), граница исчезнет, и вы можете изменить размер только с помощью ручки.

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="640" Height="480" 
    WindowStyle="None"
    AllowsTransparency="True"
    ResizeMode="CanResizeWithGrip">

    <!-- Content -->

</Window>

Результат выглядит так:

Я пытался создать окно без границ с WindowStyle="None", но когда я протестировал его, кажется, что появляется белая полоса в верхней части, после некоторых исследований это кажется "изменение размера границы", вот изображение (я отметил желтым цветом):

вызов

После некоторых исследований в интернете и множества сложных решений, не связанных с xaml, все решения, которые я нашел, были написаны в C# и много строк кода, я нашел косвенное решение здесь: максимальное пользовательское окно теряет тень эффект

<WindowChrome.WindowChrome>
    <WindowChrome 
        CaptionHeight="0"
        ResizeBorderThickness="5" />
</WindowChrome.WindowChrome>

Примечание : вам нужно использовать .NET 4.5 framework, или если вы используете более старую версию, используйте WPFShell, просто ссылайтесь на оболочку и используйте Shell:WindowChrome.WindowChrome вместо этого.

Я использовал СВОЙСТВО WindowChrome окна, если вы используете это, то белая "граница изменения размера" исчезает, но вам нужно определить некоторые свойства, чтобы работать правильно.

CaptionHeight: Это высота области заголовка (headerbar), которая позволяет выполнять Aero snap, двойной щелчок поведение, как в обычной строке заголовка. Установите значение 0 (ноль), чтобы кнопки работали.

ResizeBorderThickness: Это толщина на краю окна, где вы можете изменить размер окна. Я поставил на 5, потому что мне нравится это число, и потому что если вы ставите ноль его трудно изменить размер окна.

После использования этого короткого кода результат таков:

решение

И теперь белая граница исчезла без использования ResizeMode="NoResize" и AllowsTransparency="True", также она показывает тень в окне.

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

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

Вот полный код

<Window x:Class="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:Concursos"
    mc:Ignorable="d"
    Title="Concuros" Height="350" Width="525"
    WindowStyle="None"
    WindowState="Normal" 
    ResizeMode="CanResize"
    >
<WindowChrome.WindowChrome>
    <WindowChrome 
        CaptionHeight="0"
        ResizeBorderThickness="5" />
</WindowChrome.WindowChrome>

    <Grid>

    <Rectangle Fill="#D53736" HorizontalAlignment="Stretch" Height="35" VerticalAlignment="Top" PreviewMouseDown="Rectangle_PreviewMouseDown" />
    <Button x:Name="Btnclose" Content="r" HorizontalAlignment="Right" VerticalAlignment="Top" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>
    <Button x:Name="Btnmax" Content="2" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,35,0" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>
    <Button x:Name="Btnmin" Content="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,70,0" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>

</Grid>

Спасибо ты!

Хотя принятый ответ очень верен, просто хочу отметить, что AllowTransparency имеет некоторые недостатки. Он не позволяет дочерним оконным элементам управления появляться, т. е. WebBrowser, и обычно заставляет программное обеспечение отрисовывать, что может иметь негативные эффекты производительности.

Хотя есть и Лучшая работа.

Если вы хотите создать окно без границ, которое можно изменить и в котором можно разместить элемент управления WebBrowser или элемент управления Frame, указывающий на URL-адрес, который вы просто не могли, то содержимое указанного элемента управления будет отображаться пустым.

Однако я нашел обходной путь; в окне, если вы установите WindowStyle в None, ResizeMode в NoResize (потерпите, вы все равно сможете изменить размер, как только это будет сделано), то убедитесь, что вы сняли флажок AllowsTransparency у вас будет окно статического размера без границ и покажет управление браузером.

Теперь, вероятно, вы все еще хотите иметь возможность изменять размер правильно? Ну мы можем сделать это с помощью вызова interop:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    [DllImportAttribute("user32.dll")]
    public static extern bool ReleaseCapture();

    //Attach this to the MouseDown event of your drag control to move the window in place of the title bar
    private void WindowDrag(object sender, MouseButtonEventArgs e) // MouseDown
    {
        ReleaseCapture();
        SendMessage(new WindowInteropHelper(this).Handle,
            0xA1, (IntPtr)0x2, (IntPtr)0);
    }

    //Attach this to the PreviewMousLeftButtonDown event of the grip control in the lower right corner of the form to resize the window
    private void WindowResize(object sender, MouseButtonEventArgs e) //PreviewMousLeftButtonDown
    {
        HwndSource hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;
        SendMessage(hwndSource.Handle, 0x112, (IntPtr)61448, IntPtr.Zero);
    }

И вуаля, WPF окно без границ и все еще подвижное и изменяемое без потери совместимости с элементами управления, такими как WebBrowser

Пример здесь:

<Style TargetType="Window" x:Key="DialogWindow">
        <Setter Property="AllowsTransparency" Value="True"/>
        <Setter Property="WindowStyle" Value="None"/>
        <Setter Property="ResizeMode" Value="CanResizeWithGrip"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Window}">
                    <Border BorderBrush="Black" BorderThickness="3" CornerRadius="10" Height="{TemplateBinding Height}"
                            Width="{TemplateBinding Width}" Background="Gray">
                        <DockPanel>
                            <Grid DockPanel.Dock="Top">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition></ColumnDefinition>
                                    <ColumnDefinition Width="50"/>
                                </Grid.ColumnDefinitions>
                                <Label Height="35" Grid.ColumnSpan="2"
                                       x:Name="PART_WindowHeader"                                            
                                       HorizontalAlignment="Stretch" 
                                       VerticalAlignment="Stretch"/>
                                <Button Width="15" Height="15" Content="x" Grid.Column="1" x:Name="PART_CloseButton"/>
                            </Grid>
                            <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                                        Background="LightBlue" CornerRadius="0,0,10,10" 
                                        Grid.ColumnSpan="2"
                                        Grid.RowSpan="2">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition Width="20"/>
                                    </Grid.ColumnDefinitions>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*"/>
                                        <RowDefinition Height="20"></RowDefinition>
                                    </Grid.RowDefinitions>
                                    <ResizeGrip Width="10" Height="10" Grid.Column="1" VerticalAlignment="Bottom" Grid.Row="1"/>
                                </Grid>
                            </Border>
                        </DockPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Comments

    Ничего не найдено.