์ฌ๋ณด์ธ์!
๋ด ํ๋ก๊ทธ๋จ์ Eto ํ๋ ์์ํฌ๋ก ์ด์ํ๊ณ ์์ผ๋ฉฐ ์ธํฐํ์ด์ค๋ฅผ ์ด์ํ๊ณ ๋๋ฒ๊น ํ๋ ๋์ ๋ค์๊ณผ ๊ฐ์ ์ง๋ฌธ์ด ์์ต๋๋ค.
๋ฒํผ(Button)์์ ์ด๋ฏธ์ง ํฌ๊ธฐ ์กฐ์ ์ ๋นํ์ฑํํ๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋ฒํผ์ด Enabled = false๋ก ์ค์ ๋๋ฉด ๋ฒํผ์ด ์ฐฝ๋ฐฑํด์ง๊ณ ์์ด์ฝ์ด ๋ฐ๊ฒ ์ ์ง๋๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ด๊ฒ์ ์ด๋ป๊ฒ ๊ณ ์น ์ ์์ต๋๊น(WPF ๋ชจ๋)?
๋๊ตฌ ๋ชจ์์ WinForms ๋ชจ๋ ๋ฒํผ์ด ๊ทธ๋ฆผ ํฌ๊ธฐ์ ๋ง๊ฒ ์กฐ์ ๋์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ค์ ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ๋ ์ ๊ฒ ์ถ๋ ฅ๋ฉ๋๊น? ์ด ๋๋ฌธ์ ์ด๋ฏธ์ง๊ฐ ์ค์ ํฌ๊ธฐ๋ณด๋ค ์๊ณ ํ๋ฆฟํฉ๋๋ค.
์ํ ํ์์ค์ด ์ ํ ์๋ ์ด์ ์ ์ค์ ๋ก ํ์ํ ๊ฒฝ์ฐ ๊ต์ฒด ์ต์ ์ ๋ฌด์์ ๋๊น(ํจ๋ + ๋ ์ด๋ธ?).
Drawable ๋ฐ Scrollable ๊ตฌ์ฑ ์์ ์์ฑ์ ํตํฉํด์ผ ํ๋ CustomControl์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น? ๋๋ ๊ทธ๋ค์ ํ์ด๋ธ๋ฆฌ๋๋ก ๋ง๋ค๋ ค๊ณ ์๋ํ์ง๋ง ์๋ํ์ง ์์์ต๋๋ค. Drawable์ด Scrollable์ ์ค์ฒฉ๋ฉ๋๊น? ์๋๋ฉด ๋ ๋์ ์๋ฃจ์ ์ด ์์ต๋๊น?
GridView ์ด์ ๊ฐ ์ ๋ ฌ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
ํ์ฌ ํ์ฑ ์์ฉ ํ๋ก๊ทธ๋จ ์ฐฝ์ ์ป์ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น(๊ถํ์ด ๋์ผํ SDI ๋ฌธ์ ์ฐฝ์ด ์ฌ๋ฌ ๊ฐ ์๋ ๊ฒฝ์ฐ)?
UI ์์ฉ ํ๋ก๊ทธ๋จ์ ํ ์คํธํ๊ธฐ ์ํด ํฅํ NUnitForms์ ๊ฐ์ ์์ง์ ๋ง๋ค ๊ณํ์ ๋๊น?
WPF ๋ชจ๋์์ ClientSize๊ฐ ๋ํ ์์์ ํ ๋น๋์ง ์์ผ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ง์ ๋ ๋ ์ด์์๊ณผ ์๋ฒฝํ๊ฒ ์ ๋ ฌ๋๊ณ ๋ํ ์์ ์์ฒด๋ ์ ์ ํ ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ WinForms ๋ชจ๋์์๋ ๋ํ ์์๊ฐ ์์์ง๊ณ ๊ตฌ์ฑ ์์๊ฐ ์ ๋๋ก ์ ๋ ฌ๋์ง ์์ต๋๋ค. WinForms - ํ๋ซํผ์ผ๋ก ์ง์๋ฉ๋๊น?
๋์์ฃผ์ธ์?
์ด๋ด,
๋๋ ๋น์ ์ด ๊ฐ๊ฐ์ ๋ฌธ์ ์ ๋ํด ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋น์ ์ ๋ช ๊ฐ์ง ์์ ๋ง ๋๋ตํ ์ ์์ต๋๋ค.
Eto๋ ๋ชจ๋ ํ๋ซํผ์์ ๋์ผํ ๋ฐฉ์์ผ๋ก ํ๋ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ์ง ์์ต๋๋ค( @cwensley ๊ฐ ์ ๊ธฐ๋ ์ผ๋ถ ๋ฌธ์ ์์ ๋งํ๋ฏ์ด), ์ฃผ์ ๋ชฉํ๋ ๊ฐ ํ๋ซํผ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณด๊ณ ํ๋ํ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ด ๋ฌธ์ ์ ์ฃผ์ ์์ธ์
๋๋ค. Styling ์ ์ฌ์ฉํ์ฌ ์ผ๋ถ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
C#
new GridColumn()
{
HeaderText = header,
DataCell = new TextBoxCell()
{
Binding = binding,
TextAlignment = TextAlignment.Center,
VerticalAlignment = VerticalAlignment.Center
},
};
๋ฌผ์ด๋ด์ ์ฐฝํผํ์ง๋ง "๋ฒํผ(๋ฒํผ)์์ ์ด๋ฏธ์ง ํฌ๊ธฐ ์กฐ์ ์ ๋นํ์ฑํํ๋ ๋ฐฉ๋ฒ์ด ์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?"๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. @SlowLogicBoy๊ฐ ์ ์ํ ์คํ์ผ๋ก.
๋ด๊ฐ ๊ฐ ์ ์์๋ ๊ฐ์ฅ ๊ฑฐ๋ฆฌ๋:
Style.Add<Eto.Wpf.Forms.Controls.ButtonHandler>(null, handler => ?????? ));
๋น์ ์ด ๊ทธ๊ฒ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น?
๊ฐ์ฌ ํด์
๋๋ wpf์ ์ต์ํ์ง ์์ผ๋ฏ๋ก ์ด๊ฒ์ด ๋ด๊ฐ ๋น์ ์๊ฒ ์ค ์์๋ ๊ฒ์ ๋๋ค.
using swc = System.Windows.Controls;
Style.Add<Eto.Wpf.Forms.Controls.ButtonHandler>(null, handler => {
var grid = handler.Control.Content as swc.Grid;
if(grid == null) return; //Something in ButtonHandler changed
var imageCtrl = grid.GetChildOfType<swc.Image>().SingleOrDefault();
if(imageCtrl == null) return; //Something in ButtonHandler changed
//TODO: Stuff with imageCtrl
});
static IEnumerable<T> GetChildOfType<T>(this swc.Grid self)
{
foreach (var item in self.Children)
{
if(item is T ctrl)
yield return ctrl;
}
}
@SlowLogicBoy ์๊ฒ ๊ฐ์ฌ Wpf ๋ฒํผ์ ์ก์ธ์คํ ์ ์๋ ์ข์ ์ถ๋ฐ์ ์ ๋๋ค. ๊ณ์ ์งํํ์ฌ ์ค์ค๋ก ์ค์ผ์ผ๋ง์ ๋นํ์ฑํํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. :)
๋ ์ฝ๋์ ๊ฒฝ์ฐ ๋ค์ ์ค๋ํซ์ด ์์ ์ ์ํํฉ๋๋ค.
Style.Add<Eto.Wpf.Forms.Controls.ButtonHandler>(null, handler =>
{
var grid = handler.Control.Content as swc.Grid;
if (grid == null)
return;
var image = grid.Children.OfType<swc.Image>().FirstOrDefault();
if (image == null)
return;
image.Stretch = System.Windows.Media.Stretch.None;
});
๋์์ ์ฃผ์ @SlowLogicBoy ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๋ด,
๋๋ ๋น์ ์ด ๊ฐ๊ฐ์ ๋ฌธ์ ์ ๋ํด ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋น์ ์ ๋ช ๊ฐ์ง ์์ ๋ง ๋๋ตํ ์ ์์ต๋๋ค.
Eto๋ ๋ชจ๋ ํ๋ซํผ์์ ๋์ผํ ๋ฐฉ์์ผ๋ก ํ๋ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ์ง ์์ต๋๋ค( @cwensley ๊ฐ ์ ๊ธฐ๋ ์ผ๋ถ ๋ฌธ์ ์์ ๋งํ๋ฏ์ด), ์ฃผ์ ๋ชฉํ๋ ๊ฐ ํ๋ซํผ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณด๊ณ ํ๋ํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ๋ฌธ์ ์ ์ฃผ์ ์์ธ์ ๋๋ค. Styling ์ ์ฌ์ฉํ์ฌ ์ผ๋ถ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
C# new GridColumn() { HeaderText = header, DataCell = new TextBoxCell() { Binding = binding, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center }, };