2021년 11월 21일 일요일

WPF동영상, WPF교육, WPF 사용자정의 엘리먼트와 ScrollBar 데이터 바인딩

 

WPF동영상, WPF교육, WPF 사용자정의 엘리먼트와 ScrollBar 데이터 바인딩

http://ojc.asia/bbs/board.php?bo_table=WPF&wr_id=168 


WPF동영상, WPF교육, WPF 사용자정의 엘리먼트와 ScrollBar 데이터 바인딩

WPF동영상, WPF교육, WPF 사용자정의 엘리먼트와 ScrollBar 데이터 바인딩비주얼 스튜디오 -> WPF 응용프로그램 -> 프로젝트명 : CustomElementBindingMyElement.cs(사용자 정의 Element)using System;using System.Globalizatio

ojc.asia


https://www.youtube.com/watch?v=8EA-LXKJpkI&list=PLxU-iZCqT52Cmj47aKB1T-SxI33YL7rYS&index=12 

https://www.youtube.com/watch?v=A0atwgTrcjY&list=PLxU-iZCqT52Cmj47aKB1T-SxI33YL7rYS&index=11&t=1s 

  • 비주얼 스튜디오 -> WPF 응용프로그램 -> 프로젝트명 : CustomElementBinding
  • MyElement.cs(사용자 정의 Element)

using System;

using System.Globalization;

using System.Windows;

using System.Windows.Media;


namespace CustomElementBinding

{

    /// //////////////////////////////////////////////////////////////

    // Number라는 double 타입의 프로퍼티를 정의하고

    // 이 프로퍼티는 NumberProperty라는 의존 프로퍼티의 지원을 받는다

    // FrameworkPropertyMetadata는 초기값 이이며, 프로퍼티에 변화가 생기면 

    // OnRender를 호출하여 화면을 갱신(Number 프로퍼티를 노출)한다.

    //////////////////////////////////////////////////////////////////

    public class MyElement : FrameworkElement

    {

        // 의존 프로퍼티 선언

        // 데이터 바인딩 통보 메커니즘은 이를 통해 저절로 확보된다.

        public static DependencyProperty NumberProperty;


        // static 생성자를 통한 의존 프로퍼티 생성

        static MyElement()

        {

            NumberProperty =

                DependencyProperty.Register("Number"typeof(double),

                                            typeof(MyElement),

                    new FrameworkPropertyMetadata(0.0,

                            FrameworkPropertyMetadataOptions.AffectsRender));

        }

         

        // DependencyProperty를 CLR 프로퍼티로 노출

        public double Number

        {

            set { SetValue(NumberProperty, value); }

            get { return (double)GetValue(NumberProperty); }

        }


        // MeasureOverride를 오버라이딩해 Size를 리턴하는데 원래 이함수는 자식

        // 엘리먼트를 돌면서  크기를 계산하고 업데이트하는 메소드 이다.

        // 이함수를 재정의 안하면 자식 컨트롤의 크기가 이상해 질 수 있다.

        // MyElement의 크기를 측정해서 FrameworkElement 파생클래스(MyElement)

        // 의 Size를 리턴하는 것이다.레이아웃을 만들 때 자동으로 호출된다.

        protected override Size MeasureOverride(Size sizeAvailable)

        {

            return new Size(200, 50);

        }


        // Number 프로퍼티를 보여주는 OnRender

        protected override void OnRender(DrawingContext dc)

        {

            dc.DrawText(

                new FormattedText(Number.ToString(),

                        CultureInfo.CurrentCulture, FlowDirection.LeftToRight,

                        new Typeface("Times New Roman"), 12,

                        SystemColors.WindowTextBrush),

                new Point(0, 0));

        }

    }

}


  • MainWindow.xaml

<Window x:Class="CustomElementBinding.MainWindow"

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

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

        xmlns:src="clr-namespace:CustomElementBinding"

        Title="Custom Element Binding" Height="350" Width="525">

    <StackPanel>

        <!-- 처음 스크롤바는 MyElement의 Number 프로퍼티와 OneWayToSource 바인딩을 하므로 스크롤바의 값이 바뀌면 MyElement의 Number 속성도 바뀐다. 이때 아래쪽은 두번째 스크롤바의 Value 프로퍼티와 MyElement가 TwoWay로 바인딩 되었으므로 두번째 스크롤바도 같이 움직인다.-->

        <ScrollBar Orientation="Horizontal"

                   Margin="24" 

                   Maximum="100"

                   LargeChange="10"

                   SmallChange="1"  

                   Value="{Binding ElementName=simple, Path=Number, 

                                   Mode=OneWayToSource}" />


        <!-- 

        x:Name 속성은 FrameworkElement를 성속받지 않은 XAML 엘리먼트를 위한

        속성이다. MyElement가 동일 어셈블리상이므로 Name대신 x:Name사용

        -->

        <src:MyElement x:Name="simple"

                       HorizontalAlignment="Center" />


        <!-- 두번째 스크롤바를 움직이면 MyElement의 Number 속성도 바뀌지만

             이 값이 바뀐다고 이것이 첫번째 스크롤바와는 바인딩 되지 않으므로

             첫번째 스크롤바는 그대로 있다. -->             

        <ScrollBar Name="scroll"

               Orientation="Horizontal"

               Margin="24" 

               Maximum="100"

               LargeChange="10"

               SmallChange="1" 

               Value="{Binding ElementName=simple, Path=Number, 

                               Mode=TwoWay}" />


        <src:MyElement HorizontalAlignment="Center" 

                       Number="{Binding ElementName=scroll, Path=Value,

                                        Mode=OneWay}" />

    </StackPanel>

</Window>

  • 실행 결과


   

#WPF데이터컨텍스트#데이터컨텍스트#데이터바인딩#WPF데이터바인딩#WPF교육#WPF강좌#WPF학원#DataBinding#WPFDataBinding

WPF데이터컨텍스트, 데이터컨텍스트,데이터바인딩, WPF데이터바인딩, WPF교육, WPF강좌, WPF학원, DataBinding, WPFDataBinding

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...