Resource ์—์„œ Style ์ƒ์†

์‚ฌ๋‚ด WPF ํ”„๋กœ๊ทธ๋žจ์— ์–ด๋–ค ํ…Œ๋งˆ๊ฐ€ ์ ์šฉ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Button์˜ ๊ฒฝ์šฐ์—๋Š” Grid ๋ฐ”๋กœ ๋ฐ‘์— ๋“ค์–ด์žˆ๋Š” ํ˜•ํƒœ๋กœ Grid-Button ํ˜•ํƒœ์— ๋Œ€ํ•ด์„œ๋งŒ ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜๋„๋ก ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Grid ์•ˆ์— Button์ด ๋“ค์–ด์žˆ๋”๋ผ๋„, ์˜ˆ๋ฅผ ๋“ค์–ด, Grid-StackPanel-Button ์ˆœ์„œ๋กœ ๋“ค์–ด์žˆ์œผ๋ฉด ์Šคํƒ€์ผ ์ ์šฉ์ด ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ์ด ๋ฉ๋‹ˆ๋‹ค.

[๋˜๋Š” ๊ฒฝ์šฐ]

<Grid Grid.Row="1" Grid.ColumnSpan="3">
    <Button x:Name="btnAddCostume" Content="์ฝ”์ŠคํŠฌ ์ถ”๊ฐ€" />
    <Button x:Name="btnDelCostume" Content="์ฝ”์ŠคํŠฌ ์‚ญ์ œ" />
</Grid>

[์•ˆ๋˜๋Š” ๊ฒฝ์šฐ]

<Grid Grid.Row="1" Grid.ColumnSpan="3">
    <StackPanel Orientation="Horizontal">
        <Button x:Name="btnAddCostume" Content="์ฝ”์ŠคํŠฌ ์ถ”๊ฐ€" />
        <Button x:Name="btnDelCostume" Content="์ฝ”์ŠคํŠฌ ์‚ญ์ œ" />
    </StackPanel>
</Grid>

์ด ์ƒํ™ฉ์—์„œ Grid ์•ˆ์— Button๋“ค์ด ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด ๋ฒ„ํŠผ๋“ค์ด ๋ชจ๋‘ ๋‹ค๋‹ฅ ๋‹ค๋‹ฅ ๋ถ™์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
Margin์„ ์ฃผ๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐ๋˜๋Š” ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— Button๋“ค๋งˆ๋‹ค Margin์„ ์ฃผ์ง€ ์•Š๊ณ , Grid์•ˆ์— Grid.Resource์—์„œ Target Type ์—†์ด Style์„ ์ •์˜ํ•˜๋‹ˆ๊นŒ ํ…Œ๋งˆ๊ฐ€ ํ’€๋ ค๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

[ํ…Œ๋งˆ๊ฐ€ ํ’€๋ฆฌ๋Š” ๊ฒฝ์šฐ]

<Grid Grid.Row="1" Grid.ColumnSpan="3">
    <Grid.Resources>
        <Style TargetType="Button">
            <Setter Property="Margin" Value="0,0,5,0" />
            <Setter Property="Height" Value="28" />
            <Setter Property="Width" Value="110" />
        </Style>
    </Grid.Resources>
    <Button x:Name="btnAddCostume" Content="์ฝ”์ŠคํŠฌ ์ถ”๊ฐ€" />
    <Button x:Name="btnDelCostume" Content="์ฝ”์ŠคํŠฌ ์‚ญ์ œ" />
</Grid>

[ํ…Œ๋งˆ๊ฐ€ ํ’€๋ฆฌ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ]

<Grid Grid.Row="1" Grid.ColumnSpan="3">
    <Button x:Name="btnAddCostume"
            Width="110"
            Height="28"
            Margin="0,0,5,0"
            Content="์ฝ”์ŠคํŠฌ ์ถ”๊ฐ€" />
    <Button x:Name="btnDelCostume"
            Width="110"
            Height="28"
            Margin="0,0,5,0"
            Content="์ฝ”์ŠคํŠฌ ์‚ญ์ œ" />
</Grid>

ํ…Œ๋งˆ๋ฅผ ํ†ตํ•ด Style์ด ์ ์šฉ๋˜๋˜ ๊ฒŒ ์ œ๊ฐ€ Resource๋กœ ๋ฎ์–ด ์”Œ์›Œ์„œ ํ…Œ๋งˆ๊ฐ€ ์ง€์›Œ์ง„ ๋А๋‚Œ์ž…๋‹ˆ๋‹ค.
์ œ๊ฐ€ ๋งŒ๋“  ๋ฆฌ์†Œ์Šค ์Šคํƒ€์ผ์— ๊ธฐ์กด์˜ ํ…Œ๋งˆ๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉด ๋˜๋Š”๋ฐ ์ด๋Ÿฐ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”?

3๊ฐœ์˜ ์ข‹์•„์š”

์Œ. ์ œ์ƒ๊ฐ์—” ๋ง์”€ํ•˜์‹  ๊ฒƒ์ฒ˜๋Ÿผ ํ…Œ๋งˆ ์ƒ์† ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ตœ์„ ์ผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ~

3๊ฐœ์˜ ์ข‹์•„์š”

๊ทธ ํ…Œ๋งˆ๊ฐ€ ์–ด๋–ค ๊ฑด์ง€ ์ œ๊ฐ€ ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹คโ€ฆ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๋Š” ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ˜น์‹œ ์–ด๋–ป๊ฒŒ ์ฐพ์•„์•ผํ• ๊นŒ์š”?

2๊ฐœ์˜ ์ข‹์•„์š”

์—ฌ๋Ÿฌ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์ง€๋งŒ ํ…Œ์ŠคํŠธํ•œ ์ž๋ฃŒ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

TestStyleLive3

๋ง์”€ํ•˜์‹  ๋Œ€๋กœ ํ…Œ์ŠคํŠธํ•œ ๊ฒฐ๊ณผ โ†’ <Grid.Resources>์‚ฌ์šฉ ์‹œ ๊ธฐ์กด์— ์ ์šฉ๋œ Button Style์ด ๋ฐ˜์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
(๋ฒ„ํŠผ์˜ ํ…Œ๋งˆ์— ๊ด€๋ จ๋œ ๋‚ด์šฉ์ด ์ ์šฉ๋˜ ์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.)

TestStyleLive4

(์œ„ ์˜์ƒ์„ ๋ณด์‹œ๋ฉด default๋กœ ์„ค์ •๋œ ๋ฒ„ํŠผ Style์ด ์ ์šฉ ๋ฉ๋‹ˆ๋‹ค.)
์šฐํšŒ ๋ฐฉ๋ฒ•์œผ๋กœ ContentControl๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
ContentControl์˜ ์•ˆ์—์„œ๋Š” Button์˜ ๊ธฐ์กด Style์„ ์ž˜ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์— Margin๋งŒ ๋”ฐ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ โ†’ Stack Overflow
์ฐธ์กฐ ๋ฌธ์„œ โ†’ ContentControl Class

2๊ฐœ์˜ ์ข‹์•„์š”

@Stupid ๋‹˜ ์‹œ๊ฐ„ ๋“ค์—ฌ ํ…Œ์ŠคํŠธํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ๊ณณ์—์„œ @aroooong ๋‹˜๊ป˜์„œ ์ œ์‹œํ•ด์ฃผ์‹  ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ์„  Based On์ด Style๋ง๊ณ  Control Type๋„ ์ง€์ • ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์ด๋ผ๋Š” ๊ฒƒ์„ ์ฒ˜์Œ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Style.BasedOn Property (System.Windows) | Microsoft Docs

image

์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ ๊ธฐ๋ณธ ๋ฒ„ํŠผ์— ์ ์šฉ๋œ ์Šคํƒ€์ผ์„ ๊ทธ๋Œ€๋กœ ๋ถˆ๋Ÿฌ์™€์„œ ์ œ๊ฐ€ ์ถ”๊ฐ€ํ•œ ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌด์—‡๋ณด๋‹ค, ๊ธฐ์กด์— Grid-Button ๊ตฌ์กฐ์ผ ๋•Œ๋งŒ ํ…Œ๋งˆ๊ฐ€ ์ ์šฉ๋˜์—ˆ์—ˆ๋Š”๋ฐ ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ StackPanel-Button ๊ตฌ์กฐ์ผ ๋•Œ๋„ ๊ธฐ๋ณธ ๋ฒ„ํŠผ์˜ ํ…Œ๋งˆ๋ฅผ ์ƒ์†๋ฐ›์•„์„œ ๊ทธ๋Ÿฐ์ง€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด XAML์„ ์ ์šฉํ•ด๋„ ํ…Œ๋งˆ๊ฐ€ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

image

@Stupid @aroooong ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

8๊ฐœ์˜ ์ข‹์•„์š”

์ข‹์€ ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. :+1:
ํ…Œ๋งˆ์—์„œ x:key ="Test"์ด๋ ‡๊ฒŒ key๋ฅผ ์ผ์ผ์ด ์ง€์ •ํ•ด์„œ ๊ฐ€์ ธ์™”๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„ค์š”.
์ ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


์ ์šฉํ•ด๋ณด์•˜์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์„œโ€ฆ key๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐ€์•ผ ๊ฒ ์Šต๋‹ˆ๋‹ค.

Set1

x:key๋ฅผ ์ด์šฉํ•ด ์ง€์ •ํ•œ Style


๋ฌธ์ œ 2
.
๋ฌธ์ œ1
Control ์ƒ์† ํ–ˆ์„ ๋•Œ (BasedOn="{StaticResource {x:Type TextBox}}")

๋ฌธ์ œ 1 โ†’ TextBox Width ์‚ฌ์ด์ฆˆ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹คโ€ฆ
๋ฌธ์ œ 2 โ†’ ๋””์ž์ด๋„ˆ ํ™”๋ฉด(MainWindow.xaml)์—์„œ VS๊ฐ€ ๋จนํ†ต์ž…๋‹ˆ๋‹ค.

์›์ธ ๋ถ„์„ โ†’ ๋”ฐ๋กœ ์ง€์ •ํ•œ TextBox-Style์ด 2๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค.

// ์ฐธ์กฐ 1
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Width" Value="100" />

// ์ฐธ์กฐ 2
<Style x:Key="Test" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}" >

์ฐธ์กฐ 1์—์„  Theme์—์„œ ์ƒ์†์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
์ฐธ์กฐ 2์—์„  ์ฐธ์กฐ 1์—์„œ ์ƒ์†์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.โ€“> Width๋ฅผ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค. (๋ฌธ์ œ 1์˜ ์›์ธ)
๋ฌธ์ œ 2 โ†’ ๋ช…์‹œ๋˜์ง€ ์•Š์€ TextBox๋ฅผ ์ƒ์†, ์ƒ์†์„ ๋ฐ›์Œ์œผ๋กœ ์ƒ๊ธฐ๋Š” ํ˜„์ƒ ์ธ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
(๋”ฐ๋กœ ์ง€์ •ํ•œ TextBox-Style์ด 2๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค.) ์ฐธ์กฐ 1 ๋˜๋Š” ์ฐธ์กฐ 2๋งŒ ์‚ฌ์šฉ ํ–ˆ์„ ๋•Œ์—๋Š” ๋ฌธ์ œ ์—†์ด VS๊ฐ€ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.


(ํ•ด๊ฒฐ๋ฒ•) โ†’ (Theme TextBox Style์„ ์ƒ์†, x:key๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋ฟŒ๋ ค์ค๋‹ˆ๋‹ค)

<Style x:Key="ThemesTextBox" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}" />
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource ThemesTextBox}">
<Style x:Key="Test123" TargetType="{x:Type TextBox}" BasedOn="{StaticResource ThemesTextBox}" >

Theme ์ˆ˜์ •์—†์ด ์ƒ์† ๋ฐ›๋Š” ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ํ•ด๊ฒฐ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. :+1:

3๊ฐœ์˜ ์ข‹์•„์š”

๊ธฐ๋ณธ ์Šคํƒ€์ผ ์ƒ์† ๊ด€๋ จํ•ด์„œ ๋น„์Šทํ•œ ๊ธ€๋„ ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค. :smile:

1๊ฐœ์˜ ์ข‹์•„์š”