안녕하세요.
Window에 초기 Width, Height는 설정되어 있고 비하인드 소스에서
this.Height = 600;
이런 식으로 크기를 동적으로 변경하고 있습니다.
(버튼을 누르면 해당 크기로 변경)
그런데 Width, Height를 변경하면 Window가 순간적으로 깜박거립니다.
stackoverflow 등 검색을 해봐도 해결방법이 보이지 않네요.
Window를 깜박이지 않고 크기 변경하는 방법이 있을까요?
안녕하세요.
Window에 초기 Width, Height는 설정되어 있고 비하인드 소스에서
this.Height = 600;
이런 식으로 크기를 동적으로 변경하고 있습니다.
(버튼을 누르면 해당 크기로 변경)
그런데 Width, Height를 변경하면 Window가 순간적으로 깜박거립니다.
stackoverflow 등 검색을 해봐도 해결방법이 보이지 않네요.
Window를 깜박이지 않고 크기 변경하는 방법이 있을까요?
doblebuffer =true 하면 되지않나요??
간단한샘플코드에서도 그런동작이 보이시나요?
WPF의 UI는 DirectX기반으로 렌더링하기 때문에
doubleBuffer는 해당되지 않습니다!
.NET 8의 경우 깜빡이는 현상이 없습니다. 그리고 과거에 그런 경험이 없었던 것으로 기억하는데요, 좀 더 상황을 구체적으로 설명 주실 수 있을까요?
왠지 winform 얘기일 것 같네요. winform이면 doublebuffer 확인하면 됩니다.
동영상 캡쳐라도 올려 주시면 도움이 될 듯 합니다.
프로젝트 하나 새로 만들어서 MainWindow에 버튼만 만들어서 this.Height 변경하니 깜박거리진 않네요.
기존 프로젝트에서 .Show()로 Window 하나 띄워서 테스트해봤습니다.
Window의 Height와 그림자 효과를 BorderShadow의 Height를 동시 변경
→ 깜박거림
Window의 Height와 그림자 효과를 ‘제거한’ BorderShadow의 Height를 동시 변경
→ 깜박거림
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;
}
}
깜빡이는 현상은 컨트롤이 이동하면서 생기는 문제 처럼 보이네요.
BorderShadow.Height
와 Height
위치를 바꿔보시죠.
if (this.Height == 370)
{
this.BorderShadow.Height = 760;
this.Height = 800;
}
else
{
this.BorderShadow.Height = 330;
this.Height = 370;
}
결국에는 Height
를 변경할 때 즉각적으로 윈도우 사이즈가 변경되면서 생기는 해프닝 입니다. 윈도우 사이즈가 변한 후에 이후에 BorderShadow
의 사이즈가 변하는 바람에 그 과정이 눈에 보이게 된 것이죠.
이 현상을 해결하려면 Border
에 VerticalAlignment="Top"
를 줘도 해결됩니다. 하지만 본질적으로 윈도우 사이즈가 변경될 때 윈도우가 강제로 그려지는데 있습니다. (정확한 동작성은 클릭 이벤트 메소드에서 BP를 찍어서 단계단계 확인하면 됩니다)
와 알려주신 대로 순서를 바꾸니까 확대, 축소 둘 다 깜박거림이 사라졌네요.
감사합니다. ㅠㅠ 이렇게 쉬운 문제일 줄은…