WPF

Style 은 컨트롤의 요소들을 미리 정의해 놓고 쓰기위한 것이라고 보면됩니다.

 

아래 코드와 같이 같은 크기의 색이 다른 원을 그린다고 할때 크기를 미리 정의해 놓고 쓰게되면

색만 바꿔처리하면 되므로 코딩이 간결해집니다.

 

<Window x:Class="WpfApp3.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        mc:Ignorable="d"

        Title="MainWindow" Height="450" Width="800">

    <Canvas>

        <Canvas.Resources>

            <Style

                TargetType="{x:Type Ellipse}">

                <Setter

                     Property="Width"

                     Value="96" />

                <Setter

                     Property="Height"

                     Value="96" />

            </Style>

        </Canvas.Resources>

        <Ellipse Canvas.Left="100" Canvas.Top="50" Fill="Blue" />

        <Ellipse Canvas.Left="150" Canvas.Top="100" Fill="Red" />

        <Ellipse Canvas.Left="200" Canvas.Top="150" Fill="Green" />

    </Canvas>

</Window>

 

 

 

 

또한 미리 정의한 style 을 기본베이스로 삼아 특정속성을 바꿔 style 을 재정의 할수 있습니다.

 

<Window x:Class="WpfApp3.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        mc:Ignorable="d"

        Title="MainWindow" Height="450" Width="800">

    <Canvas>

        <Canvas.Resources>

            <Style

                TargetType="{x:Type Ellipse}">

                <Setter

                     Property="Width"

                     Value="96" />

                <Setter

                     Property="Height"

                     Value="96" />

            </Style>

            <Style

                x:Key="otherEllipse"

                TargetType="{x:Type Ellipse}"

                BasedOn ="{StaticResource {x:Type Ellipse}}">

                <Setter

                     Property="Width"

                     Value="150" />

                <Setter

                     Property="Height"

                     Value="150" />

            </Style>

        </Canvas.Resources>

        <Ellipse Canvas.Left="100" Canvas.Top="50" Fill="Blue" />

        <Ellipse Canvas.Left="150" Canvas.Top="100" Fill="Red" />

        <Ellipse Canvas.Left="200" Canvas.Top="150" Fill="Green" Style="{StaticResource otherEllipse}" />

    </Canvas>

</Window>

 

 

 

RelativeSource 는 엘리먼트 트리 내에 조상 엘리먼트나 엘리먼트 그

자체를 참조하여 바인딩을 처리합니다.

 

아래 코드를 보면

<Window x:Class="WpfApp.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:src="clr-namespace:WpfApp"

        mc:Ignorable="d"

        Title="MainWindow" Height="450" Width="800">

    <StackPanel>

        <StackPanel

            Orientation="Horizontal"

            HorizontalAlignment="Center">

            <TextBlock

                Text="{Binding RelativeSource={RelativeSource self}, Path=FontFamily}" />

        </StackPanel>

        <StackPanel

            Orientation="Horizontal"

            HorizontalAlignment="Center">

            <TextBlock

                Text= "{Binding RelativeSource={RelativeSource AncestorType={x:Type StackPanel}}, Path=Orientation}" />

        </StackPanel>

    </StackPanel>

</Window>

 

 

self 는 자기 자신을 가리키며 두번째는 AncestorType 으로 앨리먼트 트리에 StackPanel 을 가리키게 됩니다.

'WPF' 카테고리의 다른 글

[WPF] Style.Triggers 이용하여 Control 변화 주기  (0) 2020.07.10
[WPF] Style 사용하기  (0) 2020.07.10
[WPF] RelativeSource 를 이용한 바인딩  (0) 2020.07.10
[WPF] IValueConverter 사용하기  (0) 2020.07.10
[WPF] Custom FrameworkElement 사용하기  (0) 2020.07.10
[WPF] Binding  (0) 2020.07.09

IValueConverter 는 서로 다른 데이터 타입 사이의 데이터 바인딩을

처리하기 위해 사용하게 됩니다.

ConvertBack 메소드는 Mode 가 Twoway 방식일 때 사용됩니다.

 

실제 값이 숫자라고 할때 바인딩 대상은 문자를 요구할때 등의 상황에 쓰일수 있습니다.

 

아래는 double 값을 decimal 값으로 변환하되 인자 값에 따라 소숫점 뒷자리를 잘라내는 코드입니다.

 

DoubleToDecimalConverter.cs

using System;

using System.Globalization;

using System.Windows.Data;

 

namespace WpfApp

{

    [ValueConversion(typeof(double), typeof(decimal))]

    public class DoubleToDecimalConverter : IValueConverter

    {

        /// <summary>

        /// 값을 변환합니다.

        /// </summary>

        /// <param name="value">바인딩 소스에서 생성한 값입니다.</param>

        /// <param name="typeTarget">바인딩 대상 속성의 형식입니다.</param>

        /// <param name="parameter">사용할 변환기 매개 변수입니다.</param>

        /// <param name="culture">변환기에서 사용할 문화권입니다.</param>

        /// <returns>변환된 값입니다. 메서드에서 null을 반환하면 유효한 null 값이 사용됩니다.</returns>

        public object Convert(object value, Type typeTarget, object parameter, CultureInfo culture)

        {

            decimal num = new Decimal((double)value);

            if (parameter != null)

            {

                num = Decimal.Round(num, Int32.Parse(parameter as string));

            }

            return num;

        }

 

        /// <summary>

        /// 값을 변환합니다.

        /// </summary>

        /// <param name="value">바인딩 소스에서 생성한 값입니다.</param>

        /// <param name="typeTarget">바인딩 대상 속성의 형식입니다.</param>

        /// <param name="parameter">사용할 변환기 매개 변수입니다.</param>

        /// <param name="culture">변환기에서 사용할 문화권입니다.</param>

        /// <returns>변환된 값입니다. 메서드에서 null을 반환하면 유효한 null 값이 사용됩니다.</returns>

        public object ConvertBack(object value, Type typeTarget, object parameter, CultureInfo culture)

        {

            return Decimal.ToDouble((decimal)value);

        }

    }

}

 

 

 

MainWindow.xaml

<Window x:Class="WpfApp.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:src="clr-namespace:WpfApp"

        mc:Ignorable="d"

        Title="MainWindow" Height="450" Width="800">

    <Window.Resources>

        <src:DoubleToDecimalConverter x:Key="converter" />

    </Window.Resources>

    <StackPanel>

        <ScrollBar

             Name="scroll"

             Orientation="Horizontal"

             Margin="24"

             Maximum="100"

             LargeChange="10"

             SmallChange="1" />

        <Label

             HorizontalAlignment="Center"

             Content="{Binding ElementName=scroll, Path=Value, Mode=OneWay, Converter={StaticResource converter}, ConverterParameter=2}" />

    </StackPanel>

  </Window>

 

 

 

 

 

'WPF' 카테고리의 다른 글

[WPF] Style 사용하기  (0) 2020.07.10
[WPF] RelativeSource 를 이용한 바인딩  (0) 2020.07.10
[WPF] IValueConverter 사용하기  (0) 2020.07.10
[WPF] Custom FrameworkElement 사용하기  (0) 2020.07.10
[WPF] Binding  (0) 2020.07.09
[WPF] PageFunction  (0) 2020.07.09

+ Recent posts