none
[WPF] 컨트롤 외부 클릭하면 Popup창 Close하는 방법. RRS feed

  • 질문

  • 안녕하세요.

    UserControl을 하나 생성해서, 그 안에 텍스트박스와 PopUp 컨트롤을 두고 

    텍스트 박스에 텍스트를 입력하거나, 클릭하면 popup 컨트롤을 띄우고, 거기서 항목을 선택하는 기능을 구현했습니다.

    XAML 코드는 다음과 같구요.

    IsOpen, StaysOpen은 바인딩을 하는데, StaysOpen은 항상 false 입니다.

        <Grid>
            <TextBox x:Name="textBox" TextChanged="textBox_TextChanged" PreviewMouseLeftButtonUp="textBox_PreviewMouseLeftButtonUp"/>
            <Popup IsOpen="{Binding IsOpen, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" OpacityMask="Transparent" StaysOpen="{Binding StaysOpen, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                   AllowsTransparency="True" PlacementTarget="{Binding ElementName=textBox}">
                <Border CornerRadius="5" Background="#FF303030" Width="{Binding ActualWidth, ElementName=textBox}">
                    <StackPanel>
                        <Label Padding="7" x:Name="Label1" Background="Transparent" MouseLeftButtonDown="Label_MouseLeftButtonDown">         
                        </Label>
                        ......
                    </StackPanel>
                </Border>
            </Popup>
        </Grid>

    다음은 CS 코드입니다.

            private void textBox_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
            {
                if ((sender as TextBox).Text.Length > 0)
                {
                    IsOpen = !IsOpen;
                }
            }

    문제는 TextChanged 함수 안에서 IsOpen을 true로 하면, 컨트롤 외부를 클릭했을 때 popup 컨트롤은 자동으로 닫히는데,

    PreviewMouseLeftButtonUp에서 IsOpen을 true로 하면, 컨트롤 외부를 클릭해도 popup 컨트롤이 자동으로 닫히지 않습니다.

    PreviewMouseLeftButtonUp에서 e.Handel=true로 하면, popup 컨트롤이 닫히기는 하는데, 이 경우에는 문제가 popup 컨트롤에 포커스가 가지 않아서 popup 컨트롤 안의 항목을 클릭할 수가 없습니다.

    컨트롤 외부를 클릭했을 때, popup 컨트롤이 닫히게 하려면 어떻게 해야 할까요?


    2020년 5월 7일 목요일 오전 6:52

답변

  • 완벽하지는 않지만 어느 정도는 해결했습니다.

    PreviewMouseLeftButtonUp 대신, MouseLeftButtonUpEvent를 사용했습니다.

    textBox.AddHandler(MouseLeftButtonUpEvent,
                                   new RoutedEventHandler(textBox_MouseLeftButtonUp),
                                   true);

    이렇게 하면, 외부 컨트롤을 클릭하면 팝업 컨트롤이 자동으로 닫히고, 텍스트박스를 클릭하면 팝업 컨트롤이 표시됩니다.

    다만 팝업 컨트롤이 표시되어 있을 때, 텍스트박스를 클릭했을 때 팝업 컨트롤이 닫히지 않는 문제가 있지만, 일단 이 정도면 된 것 같습니다.

    • 답변으로 표시됨 라바 2020년 6월 7일 일요일 오전 8:17
    2020년 6월 7일 일요일 오전 8:17

모든 응답

  • 이 속성을 false로 설정하면 Popup 내용 창이 마우스 켑처를 가집니다. 팝업 창 밖에서 마우스 이벤트가 발생하면 팝업이 마우스 캡처를 잃고 창이 닫힙니다.
    다음 링크를 참조하시기 바랍니다.

    https://stackoverflow.com/questions/8789901/popup-with-staysopen-false

    해당 사이트는 Microsoft 에서 호스팅하지  안았기에 링크가 변경 될 수 있습니다. Microsoft 는 해당 정보의 정확성을 보증하지 않습니다.

    MSDN Community Support Ricky

    다른 커뮤니티 멤버에게 도움이 될 수 있게 문제를 해결 한 답변을 '답변으로 표시'를 클릭하시고 그렇지 않은 경우 '답변으로 표시 취소'를 클릭하시기 바랍니다. MSDN 서포트에 대한 의견이나 불만이 있을 경우 MSDNFSF@microsoft.com 으로 연락하시기 바랍니다.

    2020년 5월 12일 화요일 오전 3:13
    중재자
  • 완벽하지는 않지만 어느 정도는 해결했습니다.

    PreviewMouseLeftButtonUp 대신, MouseLeftButtonUpEvent를 사용했습니다.

    textBox.AddHandler(MouseLeftButtonUpEvent,
                                   new RoutedEventHandler(textBox_MouseLeftButtonUp),
                                   true);

    이렇게 하면, 외부 컨트롤을 클릭하면 팝업 컨트롤이 자동으로 닫히고, 텍스트박스를 클릭하면 팝업 컨트롤이 표시됩니다.

    다만 팝업 컨트롤이 표시되어 있을 때, 텍스트박스를 클릭했을 때 팝업 컨트롤이 닫히지 않는 문제가 있지만, 일단 이 정도면 된 것 같습니다.

    • 답변으로 표시됨 라바 2020년 6월 7일 일요일 오전 8:17
    2020년 6월 7일 일요일 오전 8:17