Vincent
1
WPF์์ Popup ์ ์ฌ์ฉํ ๋
- StaysOpen์์ฑ์ True๋ก ์ค๋๋ค.
- IsOpen์์ฑ์ True๋ก ์ค์ Popup์ ๋์๋๋ค.
- ๋ค๋ฅธ ํ๋ก์ธ์ค์ Window์ ํฌ์ปค์ค๋ฅผ ์ค๋๋ค. ์๋ฅผ ๋ค์ด Visual Studio๋โฆChrome ๋ธ๋ผ์ฐ์ ๋, Slack ๊ฐ์ ์๋ฌด ํ๋ก๊ทธ๋จ์
๋๋ค.
- ๋ค์ WPF์ Popup ์์ TextBox๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ด ๊ฒฝ์ฐ 4๋ฒ์์ TextBox์ Cursor๊ฐ ์ ์๊ธฐ๊ณ , 3๋ฒ์์ ํด๋ฆญํ๋ ํ๋ก์ธ์ค์ ํฌ์ปค์ค๊ฐ ๊ฐ์์ต๋๋ค. ํค๋ณด๋๋ก ์
๋ ฅํด๋ ๊ทธ์ชฝ์ ํ์ดํ์ด ๋ฉ๋๋ค.
์ ๊ทธ๋ฐ๊ฑธ๊น์?
WPF ํ๋ก์ ํธ๋ฅผ ์๋ก ๋ง๋ค์ด์ ์๋ gist ์์ค์ ๋๊ฐ์ด ๋ณต๋ถํด์ ๋ฐ๋ผํ์๋ฉด ์ฌํํ์ค ์ ์์ต๋๋ค.
๋จ์ํ๊ฒ ๋ฒ๊ทธ์ผ๊น์?
2๊ฐ์ ์ข์์
Stupid
2
๋จ์ ์ง๋ฌธ์
๋๋ค.
์ด ๊ฒ๊ณผ ๋น์ทํ ํ์์ธ๊ฐ์?
3๊ฐ์ ์ข์์
Nobody
3
// MainWindow.cs
[DllImport("USER32.DLL")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
public static void ActivatePopup(Popup popup)
{
//try to get a handle on the popup itself (via its child)
HwndSource source = (HwndSource)PresentationSource.FromVisual(popup.Child);
IntPtr handle = source.Handle;
//activate the popup
SetForegroundWindow(handle);
}
// Popup
private void popup_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
ActivatePopup(popup);
}
์์ธํ ์ค๋ช
์ ํ๋จ ๋งํฌ๋ฅผ ์ฐธ์กฐํ์ฌ์ดโฆ
4๊ฐ์ ์ข์์
Vincent
5
์โฆ์ด ์ฃผ์ฅ์ด ๊ทธ๋๋ง ์ ๋น์ฑ์ ์๋๋ฐ, Popup์ด ์
๋ ฅ ์ปจํธ๋กค์ด ์๋๋ผ ๋จ์ ์ถ๋ ฅ์ปจํธ๋กค๋ก๋ง ๋์์ธ ๋์๋ค๋ ๋ง์ ์ด ๋ต๋ณ์์ ๊ฐ์ธ์ ์ธ ์ฃผ์ฅ์ธ ๊ฒ์ธ์ง ๋ ํผ๋ฐ์ค๊ฐ ์๋์ง ๊ถ๊ธํ๋ค์.
์ผ๋จ MSDN์ ์ฐพ์๋ดค์ง๋ง Popup์ด ์๋ ๊ทธ๋ฐ ์ปจ์
์ผ๋ก ๋์์ธ๋์๋ค๋ ๊ฒ์ ๋ฐ๋ก ๋ช
์๋ ์๋์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌผ๋ก ์ ๊ฐ ๋ชป์ฐพ์ ๊ฒ์ผ ์๋ ์์ง๋ง์โฆ
WS_EX_NOACTIVATE ์๋์ฐ ๋ฉ์ธ์ง์ ๊ดํ ์ค๋ช
๋ ์ ์ดํด๊ฐ ์๋ฉ๋๋ค. ์ง์์ด ์์์ ๊ทธ๋ฐ๊ฑฐ ๊ฐ๋ค์.
๋ํ ์ธ๊ธํด์ฃผ์๊ณ , ์ฝ๋ ํ๋ก์ ํธ ๋ณธ๋ฌธ์๋ ๋์์๋ ์ ์์ ์ฝ๋๋ ์ด๋์ ๊ฐ์ ธ์จ ๊ฒ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. .NET Source Browser์๋ ํด๋น ์ฝ๋๋ฅผ ์ฐพ์๋ณผ ์ ์๊ณ . .NET Framework Reference Source์๋ ์๋ ์ฝ๋์
๋๋คโฆ
๋ต๋ณํด์ฃผ์ ๋ถ์ ์ถ์ฒ๊ฐ ๊ถ๊ธํ๋ค์โฆ;;
๊ฐ์ฌ๋๋ฆฝ๋๋คโฆ!!
3๊ฐ์ ์ข์์
dimohy
6
์ด๊ณณ์์ WS_EX_NOACTIVATE์ ์ค๋ช
์ ๋ณด์
์ผ ํฉ๋๋ค. WPF์ Popup๋ ๋ด๋ถ์ ์ผ๋ก ์๋์ฐ๋ฅผ ๋ง๋ค ๋ WS_EX_NOACTIVATE ์คํ์ผ์ด ์ ์ฉ๋๋ฏ๋ก ๋ฒ๊ทธ๋ผ๊ธฐ ๋ณด๋ค๋ ์ฌ๋ฐ๋ฅธ ๋์์ผ๋ก ํ๊ฐํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ ๋๋ผ๋ ์
๋ ฅ ํฌ์ปค์ค๊ฐ ๋๋๋ก ํ๋ ค๋ฉด @Nobody ๋์ ์ฝ๋ (์ด ์ฝ๋๋ ์ถ์ฒ๊ฐ ํน๋ณํ ์ฝ๋๋ผ๊ธฐ ๋ณด๋ค๋ ๋จ์ง ์๋์ฐ์ ์คํ์ผ์ ๋ณ๊ฒฝํ๋ ์ฝ๋์
๋๋ค) ์ฒ๋ผ ์๋ ์คํ์ผ์ ๋ณ๊ฒฝํด์ ์ธ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
5๊ฐ์ ์ข์์
Nobody๋ ์ฝ๋๋ ์๋์ฐ ์คํ์ผ ๋ณ๊ฒฝ์ด ์๋๋ผ ๋ง์ฐ์ค ํด๋ฆญ์ ํ์
์๋์ฐ ์ต์์๋ก ์ง์ ํ๋ ๊ฑฐ๊ณ
์คํ์ผ ๋ณ๊ฒฝ์ SetWindowLong(handle, GWL_EXSTYLE, GetWindowLong(handle, GWL_EXSTYLE) & ~WS_EX_NOACTIVATE);
๊ฐ์ธ์ ์ผ๋ก ํ์
์ฐฝ์ Activate ์์ฑ์ ์ง์ ํ ์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
6๊ฐ์ ์ข์์
Vincent
8
๋งํฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
ํ์ง๋ง ์ด ์ค๋ช
์ ์ฝ์ด๋ณด์๋ ์ดํด๊ฐโฆ์ฝ์ง ์๋ค์โฆใ
ใ
ํ์ง๋ง ๋ญ๊ฐ ๊ทผ๊ฑฐ๊ฐ ๋ ๋ท๋ฐ์นจ๋์๋ค๋ ๋์์ค๋ ์๋ ๊ฒ ๊ฐ์์ ์ค๋ฅ๋ผ๊ณ ์๊ฐํ์ง ์๊ณ ๋์ค์๋ TextBox๊ฐ ํ์ํ Popup์ ๋ํด์๋ Window๋ฅผ ๊ณ ๋ คํ๊ฒ ์ต๋๋ค!!
3๊ฐ์ ์ข์์
WPF (Windows Presentation Foundation)์์ Popup ์ปจํธ๋กค์ ํน๋ณํ ์๋์ฐ ๋์์ ๊ฐ์ง๊ณ ์์ต๋๋ค. StaysOpen ์์ฑ์ด True๋ก ์ค์ ๋๋ฉด, ํ์
์ ์ธ๋ถ ์์๋ฅผ ํด๋ฆญํด๋ ์๋์ผ๋ก ๋ซํ์ง ์๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ, ์ด๊ฒ์ WPF ์ ํ๋ฆฌ์ผ์ด์
๋ด์์์ ๋์๋ง์ ์๋ฏธํฉ๋๋ค.
๋ฌธ์ ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์๋์ฐ (์: Chrome ๋ธ๋ผ์ฐ์ )๋ฅผ ํ์ฑํํ๊ฒ ๋๋ฉด, ์ด์์ฒด์ ๊ฐ ํด๋น ํ๋ก์ธ์ค์ ํค๋ณด๋ ํฌ์ปค์ค๋ฅผ ์ค๋๋ค. ์ด ๊ฒฝ์ฐ, WPF ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ๋ค์ ๋์์ ํ์
์ TextBox๋ฅผ ํด๋ฆญํ๋๋ผ๋, Popup์ ์ด๋ฏธ IsOpen ์ํ์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ์๋ก์ด 'ํฌ์ปค์ค ์์ฒญโ์ด ๋ฐ์ํ์ง ์์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ, ํค๋ณด๋ ํฌ์ปค์ค๋ ์ฌ์ ํ ์ด์ ์ ํ์ฑํ๋ ํ๋ก์ธ์ค (Chrome ๋ฑ)์ ์๊ฒ ๋ฉ๋๋ค.
์ ํํ ๋ต๋ณ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง StaysOpen์ด WPF ์ ํ๋ฆฌ์ผ์ด์
์์์๋ง ์ฒ๋ฆฌ๋๋ ๊ฒ์ ๋ง๋ ๊ฒ ๊ฐ๋ค์.
๊ฐ์ ๋ก Window๋ฅผ ํ์ฑํํํ ๊ฒ ๊ฐ์ ๋ฌธ๋ฉ ํฐ๋๋ง์ ํตํด ์๋์ฒ๋ผ ์๋ํด๋ดค์ต๋๋ค.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
PreviewMouseDown += MainWindow_PreviewMouseDown;
}
private void MainWindow_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (!IsKeyboardFocused)
{
Activate();
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
popup.IsOpen = true;
}
}
5๊ฐ์ ์ข์์