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

안녕하세요.

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

this.Height = 600;

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

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

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

1 Like

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

1 Like

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

1 Like

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

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

2 Likes

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

1 Like

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

1 Like

프로젝트 하나 새로 만들어서 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 Like

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

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

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

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

5 Likes

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

2 Likes

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

2 Likes