IT

그립을 통해서만 크기를 조정할 수 있는 테두리 없이 WPF 창을 만드는 방법은 무엇입니까?

itgroup 2023. 4. 18. 22:30
반응형

그립을 통해서만 크기를 조정할 수 있는 테두리 없이 WPF 창을 만드는 방법은 무엇입니까?

「 」를 설정했을 ResizeMode="CanResizeWithGrip" pf onWindow크기 조정 그립이 오른쪽 아래 모서리에 다음과 같이 표시됩니다.

「 」를 설정했을 WindowStyle="None" 제목 있습니다.ResizeMode="NoResize"아쉽게도 이 속성 조합이 설정되면 크기 조정 그립도 사라집니다.

이 명령어를 덮어썼습니다.Window의 »ControlTemplateStyle윈도우의 테두리를 직접 지정하고 싶기 때문에 사용자가 윈도우의 크기를 4면에서 모두 조정할 필요는 없지만 크기 조정 그립이 필요합니다.

이 모든 기준을 충족하는 간단한 방법을 자세히 설명해 주시겠습니까?

  1. 테두리가 없습니다.Window가 하고 있는 ControlTemplate.
  2. 오른쪽 아래 모서리에 크기 조정 그립이 있어야 합니다.
  3. 제목 표시줄이 없습니다.

「 」를 는,AllowsTransparencyWindow(투명값을 설정하지 않아도) 테두리가 사라지고 그립을 통해서만 크기를 조정할 수 있습니다.

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

메모 을 사용해야 . : 을 사용하세요.4.5 WPFShell을 사용하여 하고 NET 4.5를 하십시오.Shell:WindowChrome.WindowChrome★★★★★★ 。

는 ★★★★★★★★★★★★★★★★★★★★★를 사용했다.WindowChrome이 옵션을 사용하면 흰색 "경계 크기 조정"이 사라지지만 올바르게 작동하려면 일부 속성을 정의해야 합니다.

캡션 높이:이것은 일반 제목 표시줄과 같이 Aero 스냅, 더블 클릭 동작을 허용하는 캡션 영역(헤더바)의 높이입니다.버튼을 작동시키려면 이 값을 0(제로)으로 설정합니다.

테두리 크기 조정두께:창의 가장자리에 있는 두께로 창의 크기를 조정할 수 있습니다.저는 이 숫자가 마음에 들어서 5를 붙이고, 0을 붙이면 윈도우 크기를 조정하기가 어렵기 때문에 5를 붙입니다.

이 짧은 코드를 사용하면 다음과 같이 됩니다.

솔루션

그리고 이제 하얀 테두리는 사용하지 않고 사라졌습니다.ResizeMode="NoResize"그리고.AllowsTransparency="True"또한 창에 그림자가 표시됩니다.

나중에 간단하고 짧은 코드로 버튼(버튼 이미지는 사용하지 않았습니다)을 쉽게 조작할 수 있도록 하는 방법에 대해 설명하겠습니다.Im new와 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>

감사해요!

인정된 답변은 매우 사실이지만 Allow Transparency에는 몇 가지 문제가 있음을 지적하고 싶습니다.자창 컨트롤(WebBrowser)을 표시할 수 없으며 일반적으로 소프트웨어 렌더링을 강제하여 성능에 부정적인 영향을 미칠 수 있습니다.

하지만 더 좋은 일이 주변에 있다.

크기가 조정 가능하고 WebBrowser 컨트롤 또는 단순히 지정할 수 없는 URL을 가리키는 프레임 컨트롤을 호스트할 수 있는 테두리가 없는 창을 만들려는 경우 해당 컨트롤의 내용은 비어 있습니다.

회피책을 찾았습니다.윈도에서 WindowStyle을 None으로 설정하고 ResizeMode를 NoResize로 설정하면(제 생각에 한 번 크기를 조정할 수 있습니다), 그리고 나서 CHECKED AllowsTransparency를 선택하면 테두리가 없는 정적 크기의 창이 나타나고 브라우저 제어가 표시됩니다.

아직 크기를 조정할 수 있어야 합니다.상호 운용 호출을 통해 이를 실현할 수 있습니다.

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

@fernando-aguirre를 사용하여 답변을 얻는 데 어려움이 있었습니다.WindowChrome일하기 위해.내 경우엔 잘 되지 않았어 왜냐면 내가 오버라이드하고 있었기 때문이야OnSourceInitialized에서MainWindow기본 클래스 메서드를 호출하지 않습니다.

protected override void OnSourceInitialized(EventArgs e)
{
    ViewModel.Initialize(this);
    base.OnSourceInitialized(e); // <== Need to call this!
}

이것은 나를 오랫동안 괴롭혔다.

언급URL : https://stackoverflow.com/questions/611298/how-to-create-a-wpf-window-without-a-border-that-can-be-resized-via-a-grip-only

반응형