Microsoft 에서 제공 하고 있는 ControlTemplate Examples 입니다.

ListBox, TreeView등등의 컨트롤에 기본적으로 적용되어있는 Template을 확인 할 수 있습니다.

컨트롤에 맞는 Template 으로 커스터 마이징이 가능 합니다.

 

[제공 Template]

n  Button ControlTemplate Example

n  CheckBox ControlTemplate Example

n  ComboBox ControlTemplate Example

n  ComboBoxItem ControlTemplate Example

n  ContextMenu ControlTemplate Example

n  DocumentViewer ControlTemplate Example

n  Expander ControlTemplate Example

n  Frame ControlTemplate Example

n  GroupBox ControlTemplate Example

n  Label ControlTemplate Example

n  ListBox ControlTemplate Example

n  ListBoxItem ControlTemplate Example

n  ListView ControlTemplate Example

n  ListViewItem ControlTemplate Example

n  Menu ControlTemplate Example

n  MenuItem ControlTemplate Example

n  NavigationWindow ControlTemplate Example

n  ProgressBar ControlTemplate Example

n  RadioButton ControlTemplate Example

n  ScrollBar ControlTemplate Example

n  ScrollViewer ControlTemplate Example

n  Slider ControlTemplate Example

n  StatusBar ControlTemplate Example

n  TabControl ControlTemplate Example

n  TabItem ControlTemplate Example

n  TextBox ControlTemplate Example

n  ToolBar ControlTemplate Example

n  ToolTip ControlTemplate Example

n  TreeView ControlTemplate Example

n  TreeViewItem ControlTemplate Example

n  Window ControlTemplate Example

 

다운로드는 아래 사이트에서 받아가세요!

 

 

ControlTemplate Examples : http://msdn.microsoft.com/en-us/library/vstudio/aa970773(v=vs.90).aspx

Posted by 홍상길 홍상길

출처 : http://social.msdn.microsoft.com/Forums/en/wpf/thread/d32bb0af-b14f-4e88-ad36-098d11cd375c

 

WPF의 StackPanel 컨트롤에 들어있는 아이템들에 Drag and Drop 기능을 입혀 보겠습니다.

 

1. StackPanel을 만들고 AllowDrop 속성 및 마우스 이벤트를 등록 합니다.
   테스트를 위해 TextBlock 아이템을 넣어 놓았습니다.

<StackPanel x:Name="Container" Orientation="Vertical"
                            HorizontalAlignment="Stretch"
                                AllowDrop="True"
                                PreviewMouseLeftButtonDown="Container_PreviewMouseLeftButtonDown"
                                PreviewMouseLeftButtonUp="Container_PreviewMouseLeftButtonUp"
                                PreviewMouseMove="Container_PreviewMouseMove"
                                Drop="Container_Drop">
           
            <TextBlock Text="1번" FontSize="20" HorizontalAlignment="Stretch" TextAlignment="Center" Background="Red"/>
            <TextBlock Text="2번" FontSize="20" HorizontalAlignment="Stretch" TextAlignment="Center" Background="Blue"/>
            <TextBlock Text="3번" FontSize="20" HorizontalAlignment="Stretch" TextAlignment="Center" Background="Yellow"/>
            <TextBlock Text="4번" FontSize="20" HorizontalAlignment="Stretch" TextAlignment="Center" Background="Beige"/>
           
        </StackPanel>

 

 

2. Behind Code에 추가된 이벤트 함수에 Drag and Drop에 필요한 변수를 등록 합니다.

 

        private bool _isDown;  // 마우스 클릭 체크
        private bool _isDragging; // 컨트롤을 드레깅 하는지 체크
        private Point _startPoint; // Drag 하는 아이템의 시작 위치
        private UIElement _realDragSource; 
        private UIElement _dummyDragSource = new UIElement();

 

3. 마우스를 클릭 했을때 StackPanel 안에 있는 자식 컨트롤을 선택 하는지 체크 하는 코드를 입력 합니다.

 

        private void Container_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (e.Source == this.Container)
            {
            }
            else
            {
                _isDown = true;
                _startPoint = e.GetPosition(this.Container);
            }
        }

 

4. 마우스를 땠을때 변수를 초기화 시켜 주는 코드를 입력 합니다.

        private void Container_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            _isDown = false;
            _isDragging = false;
            if (_realDragSource != null)
            {
                _realDragSource.ReleaseMouseCapture();
            }
        }

 

5. 컨트롤을 드레깅 하는동안 위치를 확인 하는 코드를 입력 합니다.

        private void Container_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            if (_isDown)
            {
                if ((_isDragging == false) && ((Math.Abs(e.GetPosition(this.Container).X - _startPoint.X) > SystemParameters.MinimumHorizontalDragDistance) ||
                    (Math.Abs(e.GetPosition(this.Container).Y - _startPoint.Y) > SystemParameters.MinimumVerticalDragDistance)))
                {
                    _isDragging = true;
                    _realDragSource = e.Source as UIElement;
                    _realDragSource.CaptureMouse();
                    DragDrop.DoDragDrop(_dummyDragSource, new DataObject("UIElement", e.Source, true), DragDropEffects.Move);
                }
            }
        }

 

6. 컨트롤을 Drop 시켰을때 컨트롤들의 순서를 바꿔주는 코드를 입력합니다.

         private void Container_Drop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent("UIElement"))
            {
                UIElement droptarget = e.Source as UIElement;
                int droptargetIndex = -1, i = 0;

 

                foreach (UIElement element in this.Container.Children)
                {
                    if (element.Equals(droptarget))
                    {
                        droptargetIndex = i;
                        break;
                    }
                    i++;
                }
                if (droptargetIndex != -1)
                {
                    this.Container.Children.Remove(_realDragSource);
                    this.Container.Children.Insert(droptargetIndex, _realDragSource);
                }

 

                _isDown = false;
                _isDragging = false;
                _realDragSource.ReleaseMouseCapture();
            }
        }

 

샘플 다운로드 : StackPanelDragAndDrop.zip

 

Posted by 홍상길 홍상길

[Binding 설정하기]

TestModel model = new TestModel();  // Binding에 필요한 Source

TextBox textBox= new TextBox ();  // BindingControl 생성

Binding binding = new Binding();  // Binding 객체를 생성

binding.Source = model ; // Binding 객체에 Source를 설정

binding.Path = new PropertyPath("Title"); // Source 에서 Binding 에 사용할 Property 설정

binding.Mode = BindingMode.TwoWay; // Binding Mode를 설정한다.
BindingOperations.SetBinding (textBox ,
TextBox.TextProperty, binding); // textBox Binding Property를 설정하고 Binding 객체를 설정 한다.

 

[Binding Mode]

속성

설명

TwoWay

대상 속성이나 소스 속성 중 하나가 변경될 때마다 대상 속성이나 소스 속성을 업데이트

OneWay

소스 속성이 변경될 때 대상 속성을 업데이트

OneTime

응용 프로그램이 시작되거나 DataContext가 변경될 때만 대상 속성을 업데이트

OneWayToSource

대상 속성이 변경될 때 소스 속성을 업데이트

Default

대상 속성의 기본 Mode 값을 사용

 

 

[Binding 모두 제거하기]

BindingOperations.ClearBinding(control, Control.TitleProperty); // control에 설정되어 있는 Title Binding을 제거

 

[Binding 모두 제거하기]

BindingOperations.ClearAllBindings(control); // control에 설정되어 있는 Binding을 모두 제거

 

MSDN : http://msdn.microsoft.com/ko-kr/library/ms617928(v=vs.90).aspx

Posted by 홍상길 홍상길

Behind Code에서 Binding을 구현하기 위해서는 Binding할 객체에 DependencyProperty가 생성되어 있어야 한다.

 

DependencyProperty를 구현하기 위해서는 대략 아래 3가지가 필요하다.

 

[Property]

        public string TItle
        {
            get { return (string)GetValue(TItleProperty); }
            set { SetValue(TItleProperty, value); }
        }

 

[DependencyProperty]

public static readonly DependencyProperty TitleProperty =
             DependencyProperty.Register("Title", typeof(string), typeof(TESTClass), new PropertyMetadata(TESTClass.TitlePropertyChangedCallback));

 

 

[Callback function] : 값이 변경될때 발생 되는 이벤트

        public static void TitlePropertyChangedCallback(
            DependencyObject controlInstance, DependencyPropertyChangedEventArgs e)
        {
        }

 

 

Posted by 홍상길 홍상길

MS MIX10 에서 발표 되었던 MVVM 패턴에 도움을 주는 Toolkit 입니다.

자유롭게 사용할 수 있는 MIT 라이센스로 등록 되어 있구요.

설치 하게 되면 Visual Studio 에서 프로젝트 생성시 MVVM Light Toolkit 기반으로 생성도 가능 하며

Silverlight, WPF, Windows 8 모두 활용이 가능 하도록 제공 되고 있습니다.

 

 

 

다운로드 : http://mvvmlight.codeplex.com/

Posted by 홍상길 홍상길

출처 : http://dotnet-experience.blogspot.kr/2011/01/wpf-datagrid-row-double-click.html

 

DataGrid에 마우스 더블 클릭 이벤트를 주고 해당 아이템의 Row 행을 찾는 소스 입니다.

 

 

[XAML 파일]

<DataGrid x:Name="dataGrid" MouseDoubleClick="DataGrid_MouseDoubleClick"/>

 

[CS 파일]

private void DataGrid_MouseDoubleClick(object sender,
                                  System.Windows.Input.MouseButtonEventArgs e)
{
    IInputElement element = e.MouseDevice.DirectlyOver;
    if(element != null && element is FrameworkElement)
    {
        if (((FrameworkElement)element).Parent is DataGridCell)
        {
            var grid = sender as DataGrid;
            if (grid != null && grid.SelectedItems != null
&& grid.SelectedItems.Count == 1)
            {
                var rowView = grid.SelectedItem as DataRowView;
                if (rowView != null)
                {
                    DataRow row = rowView.Row;
                    //do something with the underlying data
                }
            }
        }
    }
}

 

 

 

 

 

 

Posted by 홍상길 홍상길

출처 : http://brentedwards.net/2012/03/11/wpf-datagridrow-double-click-with-mvvm/

 

DataGrid에서 행 더블 클릭 시 이벤트 발생 시키는 소스 입니다.

 

[XAML 파일에 적용]

<DataGrid ... >
   
<DataGrid.ItemContainerStyle>
       
<Style TargetType="DataGridRow">
           
<EventSetter RoutedEvent="MouseDoubleClick" Handler="Row_DoubleClick"/>
       
</Style>
   
</DataGrid.ItemContainerStyle>
    ...Source...
</DataGrid>

 

[CS 파일에 적용]

protected void Row_DoubleClick(object sender, EventArgs args)
{
    var row = sender as DataGridRow;
    if (row != null && row.IsSelected)
    {
        ...Source...
    }
}

 

 

 

 

Posted by 홍상길 홍상길
이전버튼 1 이전버튼

블로그 이미지
홍상길

공지사항

Yesterday9
Today1
Total293,506

달력

 « |  » 2019.9
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

최근에 달린 댓글

글 보관함