첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

■ GroupBox 클래스를 사용해 그룹 컨트롤을 만드는 방법을 보여준다.

TestSolution.zip
다운로드

▶ Generic.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestLibrary">
    <Style TargetType="{x:Type local:GroupControl}">
        <Style.Resources>
            <BorderGapMaskConverter x:Key="BorderGapMaskConverter"/>
        </Style.Resources>
        <Setter Property="BorderBrush"     Value="#D5DFE5" />
        <Setter Property="BorderThickness" Value="1"       />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupBox}">
                    <Grid SnapsToDevicePixels="true">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="6"    />
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="*"    />
                            <ColumnDefinition Width="6"    />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*"    />
                            <RowDefinition Height="6"    />
                        </Grid.RowDefinitions>
                        <Border Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="4" Grid.RowSpan="3"
                            CornerRadius="4"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            BorderBrush="White">
                            <Border.OpacityMask>
                                <MultiBinding ConverterParameter="7" Converter="{StaticResource BorderGapMaskConverter}">
                                    <Binding ElementName="headerBorder" Path="ActualWidth" />
                                    <Binding Path="ActualWidth"  RelativeSource="{RelativeSource Self}" />
                                    <Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}" />
                                </MultiBinding>
                            </Border.OpacityMask>
                            <Border x:Name="outerBorder"
                                CornerRadius="3"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}">
                                <Border
                                    CornerRadius="2"
                                    BorderBrush="White"
                                    BorderThickness="{TemplateBinding BorderThickness}" />
                            </Border>
                        </Border>
                        <Border x:Name="headerBorder" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2"
                            Padding="3 1 3 0">
                            <ContentPresenter
                                ContentSource="Header"
                                RecognizesAccessKey="True"
                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                        </Border>
                        <ContentPresenter Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="2"
                            Margin="{TemplateBinding Padding}"
                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="local:GroupControl.GroupStyle" Value="Rectangle">
                            <Setter TargetName="outerBorder" Property="CornerRadius" Value="0" />
                        </Trigger>
                        <Trigger Property="local:GroupControl.GroupStyle" Value="HeaderLine">
                            <Setter TargetName="outerBorder" Property="CornerRadius"    Value="0"       />
                            <Setter TargetName="outerBorder" Property="BorderThickness" Value="0 2 0 0" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

 

▶ GroupStyle.cs

namespace TestLibrary
{
    /// <summary>
    /// 그룹 스타일
    /// </summary>
    public enum GroupStyle
    {
        /// <summary>
        /// 둥근 사각형
        /// </summary>
        RoundRectangle,

        /// <summary>
        /// 사각형
        /// </summary>
        Rectangle,

        /// <summary>
        /// 선
        /// </summary>
        HeaderLine
    }
}

 

▶ GroupControl.cs

using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace TestLibrary
{
    /// <summary>
    /// 그룹 컨트롤
    /// </summary>
    public class GroupControl : GroupBox
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Public

        #region 그룹 스타일 의존 속성 - GroupStyleProperty

        /// <summary>
        /// 그룹 스타일 의존 속성
        /// </summary>
        private static DependencyProperty GroupStyleProperty;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 그룹 스타일 - GroupStyle

        /// <summary>
        /// 그룹 스타일
        /// </summary>
        [Category("GroupControl")]
        [Description("그룹 스타일을 가져오거나 설정합니다.")]
        public GroupStyle GroupStyle
        {
            get
            {
                return (GroupStyle)GetValue(GroupStyleProperty);
            }
            set
            {
                SetValue(GroupStyleProperty, value);
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Static

        #region 생성자 - GroupControl()

        /// <summary>
        /// 생성자
        /// </summary>
        static GroupControl()
        {
            GroupStyleProperty = UIHelper.RegisterDependencyProperty
            (
                GroupStyle.RoundRectangle,
                false,
                false,
                false,
                true,
                null,
                "GroupStyle",
                typeof(GroupStyle),
                typeof(GroupControl),
                null
            );

            DefaultStyleKeyProperty.OverrideMetadata(typeof(GroupControl), new FrameworkPropertyMetadata(typeof(GroupControl)));
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Instance
        //////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - GroupControl()

        /// <summary>
        /// 생성자
        /// </summary>
        public GroupControl()
        {
            BorderBrush = Brushes.Black;
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요