Window의 Width, Height를 변경하면 화면이 순간적으로 깜빡거리는데 방법이 없을까요?

안녕하세요.

Window에 초기 Width, Height는 설정되어 있고 비하인드 소스에서

this.Height = 600;

이런 식으로 크기를 동적으로 변경하고 있습니다.
(버튼을 누르면 해당 크기로 변경)

그런데 Width, Height를 변경하면 Window가 순간적으로 깜박거립니다.
stackoverflow 등 검색을 해봐도 해결방법이 보이지 않네요.

Window를 깜박이지 않고 크기 변경하는 방법이 있을까요?

1개의 좋아요

doblebuffer =true 하면 되지않나요??

1개의 좋아요

간단한샘플코드에서도 그런동작이 보이시나요?

1개의 좋아요

WPF의 UI는 DirectX기반으로 렌더링하기 때문에
doubleBuffer는 해당되지 않습니다!

.NET 8의 경우 깜빡이는 현상이 없습니다. 그리고 과거에 그런 경험이 없었던 것으로 기억하는데요, 좀 더 상황을 구체적으로 설명 주실 수 있을까요?

2개의 좋아요

왠지 winform 얘기일 것 같네요. winform이면 doublebuffer 확인하면 됩니다.

1개의 좋아요

동영상 캡쳐라도 올려 주시면 도움이 될 듯 합니다.

1개의 좋아요

프로젝트 하나 새로 만들어서 MainWindow에 버튼만 만들어서 this.Height 변경하니 깜박거리진 않네요.

기존 프로젝트에서 .Show()로 Window 하나 띄워서 테스트해봤습니다.

  1. Window의 Height와 그림자 효과를 BorderShadow의 Height를 동시 변경
    → 깜박거림

  2. Window의 Height와 그림자 효과를 ‘제거한’ BorderShadow의 Height를 동시 변경
    → 깜박거림

  3. Window의 Height와 VerticalAlignment=“Top” 설정한 BorderShadow의 Height를 동시 변경
    → 크기 확대 시 안 깜박거림
    → 크기 축소 시 깜박거림

<DropShadowEffect x:Key="BorderShadowEffect" Direction="0" Opacity="0.4" ShadowDepth="0" BlurRadius="15"/>

<Style x:Key="BorderShadowStyle" TargetType="Border">
    <Setter Property="Background" Value="White"/>
    <Setter Property="Margin" Value="8,8,8,0"/>
    <Setter Property="Effect" Value="{StaticResource BorderShadowEffect}"/>
</Style>
<Window 
        WindowStyle="None" AllowsTransparency="True" Background="White"
        Title="TestSimpleWindow" Height="340" Width="370">

    <Border x:Name="BorderShadow" Style="{StaticResource BorderShadowStyle}" Width="300" Height="330" >
<!--<Border x:Name="BorderShadow" BorderBrush="Black" BorderThickness="2" Width="300" Height="330">-->
        <StackPanel>
            <Button x:Name="BtnResize" Width="100" Height="30" Content="변경" Click="btnResize_Click"/>

        </StackPanel>
    </Border>
</Window>

private void BtnResize_Click(object sender, RoutedEventArgs e)
{
    if (this.Height == 370)
    {
        this.Height = 800;
        this.BorderShadow.Height = 760;
    }
    else
    {
        this.Height = 370;
        this.BorderShadow.Height = 330;
    }
}
1개의 좋아요

깜빡이는 현상은 컨트롤이 이동하면서 생기는 문제 처럼 보이네요.

BorderShadow.HeightHeight 위치를 바꿔보시죠.

            if (this.Height == 370)
            {
                this.BorderShadow.Height = 760;
                this.Height = 800;
            }
            else
            {
                this.BorderShadow.Height = 330;
                this.Height = 370;
            }

결국에는 Height를 변경할 때 즉각적으로 윈도우 사이즈가 변경되면서 생기는 해프닝 입니다. 윈도우 사이즈가 변한 후에 이후에 BorderShadow의 사이즈가 변하는 바람에 그 과정이 눈에 보이게 된 것이죠.

5개의 좋아요

이 현상을 해결하려면 BorderVerticalAlignment="Top"를 줘도 해결됩니다. 하지만 본질적으로 윈도우 사이즈가 변경될 때 윈도우가 강제로 그려지는데 있습니다. (정확한 동작성은 클릭 이벤트 메소드에서 BP를 찍어서 단계단계 확인하면 됩니다)

2개의 좋아요

와 알려주신 대로 순서를 바꾸니까 확대, 축소 둘 다 깜박거림이 사라졌네요.
감사합니다. ㅠㅠ 이렇게 쉬운 문제일 줄은…

2개의 좋아요