Eto: Eto๋กœ์˜ ์ด์‹์— ๊ด€ํ•œ ์งˆ๋ฌธ

์— ๋งŒ๋“  2017๋…„ 06์›” 16์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: picoe/Eto

์—ฌ๋ณด์„ธ์š”!

๋‚ด ํ”„๋กœ๊ทธ๋žจ์„ Eto ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ด์‹ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์‹ํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๋Š” ๋™์•ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ฒ„ํŠผ(Button)์—์„œ ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์กฐ์ •์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  2. ๋ฒ„ํŠผ์ด Enabled = false๋กœ ์„ค์ •๋˜๋ฉด ๋ฒ„ํŠผ์ด ์ฐฝ๋ฐฑํ•ด์ง€๊ณ  ์•„์ด์ฝ˜์ด ๋ฐ๊ฒŒ ์œ ์ง€๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(WPF ๋ชจ๋“œ)?

  3. ๋„๊ตฌ ๋ชจ์Œ์˜ WinForms ๋ชจ๋“œ ๋ฒ„ํŠผ์ด ๊ทธ๋ฆผ ํฌ๊ธฐ์— ๋งž๊ฒŒ ์กฐ์ •๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‹ค์ œ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ ๋” ์ ๊ฒŒ ์ถœ๋ ฅ๋ฉ๋‹ˆ๊นŒ? ์ด ๋•Œ๋ฌธ์— ์ด๋ฏธ์ง€๊ฐ€ ์‹ค์ œ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘๊ณ  ํ๋ฆฟํ•ฉ๋‹ˆ๋‹ค.

  4. ์ƒํƒœ ํ‘œ์‹œ์ค„์ด ์ „ํ˜€ ์—†๋Š” ์ด์œ ์™€ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ต์ฒด ์˜ต์…˜์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ(ํŒจ๋„ + ๋ ˆ์ด๋ธ”?).

  5. Drawable ๋ฐ Scrollable ๊ตฌ์„ฑ ์š”์†Œ ์†์„ฑ์„ ํ†ตํ•ฉํ•ด์•ผ ํ•˜๋Š” CustomControl์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๋“ค์„ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ๋กœ ๋งŒ๋“ค๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Drawable์ด Scrollable์— ์ค‘์ฒฉ๋ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

  6. GridView ์—ด์˜ ๊ฐ’ ์ •๋ ฌ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

  7. ํ˜„์žฌ ํ™œ์„ฑ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ฐฝ์„ ์–ป์œผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ(๊ถŒํ•œ์ด ๋™์ผํ•œ SDI ๋ฌธ์„œ ์ฐฝ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ)?

  8. UI ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ํ–ฅํ›„ NUnitForms์™€ ๊ฐ™์€ ์—”์ง„์„ ๋งŒ๋“ค ๊ณ„ํš์ž…๋‹ˆ๊นŒ?

  9. WPF ๋ชจ๋“œ์—์„œ ClientSize๊ฐ€ ๋Œ€ํ™” ์ƒ์ž์— ํ• ๋‹น๋˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ง€์ •๋œ ๋ ˆ์ด์•„์›ƒ๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ์ •๋ ฌ๋˜๊ณ  ๋Œ€ํ™” ์ƒ์ž ์ž์ฒด๋Š” ์ ์ ˆํ•œ ํฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ WinForms ๋ชจ๋“œ์—์„œ๋Š” ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ์ž‘์•„์ง€๊ณ  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ œ๋Œ€๋กœ ์ •๋ ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. WinForms - ํ”Œ๋žซํผ์œผ๋กœ ์ง€์›๋ฉ๋‹ˆ๊นŒ?

๋„์™€์ฃผ์„ธ์š”?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๋ด,

๋‚˜๋Š” ๋‹น์‹ ์ด ๊ฐ๊ฐ์˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋ช‡ ๊ฐ€์ง€ ์š”์ ๋งŒ ๋Œ€๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Eto๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํ–‰๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( @cwensley ๊ฐ€ ์ œ๊ธฐ๋œ ์ผ๋ถ€ ๋ฌธ์ œ์—์„œ ๋งํ–ˆ๋“ฏ์ด), ์ฃผ์š” ๋ชฉํ‘œ๋Š” ๊ฐ ํ”Œ๋žซํผ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด๊ณ  ํ–‰๋™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฌธ์ œ์˜ ์ฃผ์š” ์›์ธ์ž…๋‹ˆ๋‹ค. Styling ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ด๊ฒƒ์€ Styling์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ด ๋ฌธ์ œ ์™€ ๊ด€๋ จ
  3. ์Šคํƒ€์ผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ WinForms ๋™์ž‘(winforms๋กœ ์ž‘์—…ํ•  ๋•Œ ๊ธฐ์–ตํ•˜๋Š” ํ•œ)์ด๊ธฐ ๋•Œ๋ฌธ์—
  4. ๋ชจ๋“  ํ”Œ๋žซํผ์— StatusBar๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ง์”€ํ•˜์‹  ๋Œ€๋กœ ํ•ญ๋ชฉ์ด ํฌํ•จ๋œ ์Šคํƒ ๋ ˆ์ด์•„์›ƒ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  5. Drawable์„ Scrollable ๋ ˆ์ด์•„์›ƒ์— ๋„ฃ๊ณ  Drawable ์ปจํŠธ๋กค์„ ์›ํ•˜๋Š” ๋งŒํผ ํฌ๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?
  6. TextBoxCell์—๋Š” TextAlignment ๋ฐ VerticalAlignment๋ผ๋Š” ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    C# new GridColumn() { HeaderText = header, DataCell = new TextBoxCell() { Binding = binding, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center }, };
  7. ๋‹น์‹ ์€ ์ด๋ฏธ ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋‹ต์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

๋ชจ๋“  5 ๋Œ“๊ธ€

์ด๋ด,

๋‚˜๋Š” ๋‹น์‹ ์ด ๊ฐ๊ฐ์˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋ช‡ ๊ฐ€์ง€ ์š”์ ๋งŒ ๋Œ€๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Eto๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํ–‰๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( @cwensley ๊ฐ€ ์ œ๊ธฐ๋œ ์ผ๋ถ€ ๋ฌธ์ œ์—์„œ ๋งํ–ˆ๋“ฏ์ด), ์ฃผ์š” ๋ชฉํ‘œ๋Š” ๊ฐ ํ”Œ๋žซํผ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด๊ณ  ํ–‰๋™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฌธ์ œ์˜ ์ฃผ์š” ์›์ธ์ž…๋‹ˆ๋‹ค. Styling ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ด๊ฒƒ์€ Styling์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ด ๋ฌธ์ œ ์™€ ๊ด€๋ จ
  3. ์Šคํƒ€์ผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ WinForms ๋™์ž‘(winforms๋กœ ์ž‘์—…ํ•  ๋•Œ ๊ธฐ์–ตํ•˜๋Š” ํ•œ)์ด๊ธฐ ๋•Œ๋ฌธ์—
  4. ๋ชจ๋“  ํ”Œ๋žซํผ์— StatusBar๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ง์”€ํ•˜์‹  ๋Œ€๋กœ ํ•ญ๋ชฉ์ด ํฌํ•จ๋œ ์Šคํƒ ๋ ˆ์ด์•„์›ƒ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  5. Drawable์„ Scrollable ๋ ˆ์ด์•„์›ƒ์— ๋„ฃ๊ณ  Drawable ์ปจํŠธ๋กค์„ ์›ํ•˜๋Š” ๋งŒํผ ํฌ๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?
  6. TextBoxCell์—๋Š” TextAlignment ๋ฐ VerticalAlignment๋ผ๋Š” ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    C# new GridColumn() { HeaderText = header, DataCell = new TextBoxCell() { Binding = binding, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center }, };
  7. ๋‹น์‹ ์€ ์ด๋ฏธ ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋‹ต์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

๋ฌผ์–ด๋ด์„œ ์ฐฝํ”ผํ•˜์ง€๋งŒ "๋ฒ„ํŠผ(๋ฒ„ํŠผ)์—์„œ ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์กฐ์ ˆ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?"๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. @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;
    }
}

wpf์—์„œ Eto ๋ฒ„ํŠผ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

@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 ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰