2021년 11월 21일 일요일

(WPF학원교육)WPF 데이터 바인딩(Data Binding) 실습(OneWay, TwoWay, OneWayToSource, OneTime)

 (WPF학원교육)WPF 데이터 바인딩(Data Binding) 실습(OneWay, TwoWay, OneWayToSource, OneTime)

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


WPF 데이터 바인딩(Data Binding) 실습(OneWay, TwoWay, OneWayToSource, OneTime)

WPF 데이터 바인딩(Data Binding) 실습(OneWay, TwoWay, OneWayToSource, OneTime)TextBox의 Text 속성과 Label의 Content 속성을 바인딩 하는 예제를 작성 하겠습니다. TextBox의 값을 수정하면 Text 속성의 값을 Label의 Conte

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 

  • TextBox의 Text 속성과 Label의 Content 속성을 바인딩 하는 예제를 작성 하겠습니다. TextBox의 값을 수정하면 Text 속성의 값을 Label의 Content 속성에 바인딩 하는 예제 입니다.
  • C#코드에서 TextBox의 TextChanged 이벤트 핸들러를 이용하거나 또는 아래처럼 XAML 파일과 같이 데이터 바인딩을 정의할 수 있습니다.
  • MainWindow.xaml

<Window x:Class="BindingTextBoxToScroll.MainWindow"

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

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

        Title="Label, TextBox 데이터 바인딩" Height="350" Width="525">

    <StackPanel >

        <!-- Source. -->

        <TextBox Name="txt1" Margin="24" />


        <!-- Target. -->

        <!-- ElementName=txt1 대신 Source={x:Reference txt1}가능 -->

        <Label HorizontalAlignment="Center" BorderBrush="Black" 

BorderThickness="2"

           Content="{Binding ElementName=txt1, Path=Text}" />

    </StackPanel></Window>

  • 바인딩 자체는 언제나 타겟에 설정 합니다. Label 컨트롤의 Content 프로퍼티에 다음과 같이 설정되었습니다.

Content="{Binding ElementName=txt1, Path=Text}"

Binding 키워드는 마크업 확장으로 Content 속성의 중괄호안에 Binding 키워드가 있다. Binding의 속성중 중 ElementName은 소스객체를 지정하는데 TextBox의 Name 속성에 정의된 이름이 사용되었고, Path 속성에는 소스 객체의 속성이 와야 하는데, TextBox의 Text 속성이 설정되었습니다.

  • 위 XAML에서 바인딩 정의 내에 따옴표를 사용하고 싶다면 아래과 같이 프로퍼티 엘리먼트를 사용하면 됩니다.

<!-- Target. -->

<Label HorizontalAlignment="Center">

    <Label.Content>

        <Binding ElementName="txt1" Path="Text"/>

    </Label.Content>

</Label>

  • 바인딩 정의가 있는 컨트롤은 기본적으로 항상 타겟입니다. 바인딩 타겟은 DependencyObject로부터 상속되며 바인딩이 설정되는 속성은 반드시 의존 프로퍼티의 지원을 받아야 한다. (Label의 Content 속성은 의존프로퍼티(속성)인 ContentProperty로부터 의존속성으로 등록 되어있다.)

 

Label의 부모 클래스인 ContentControl의 내용


public static readonly DependencyProperty ContentProperty =

                DependencyProperty.Register(

                        "Content",

                        typeof(object),

                        typeof(ContentControl),

                        new FrameworkPropertyMetadata(

                                (object)null,

                                new PropertyChangedCallback(OnContentChanged)));

 

public object Content

        {

            get { return GetValue(ContentProperty); }

            set { SetValue(ContentPropertyvalue); }

        }

 

  • 바인딩 소스는 반드시 의존속성 일 필요는 없습니다.
  • C#코드로 구현한 바인딩 예제 입니다.
  • MainWindow.xaml

<Window x:Class=" BindingTextBoxToLabel.MainWindow"

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

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

        Title="Label, ScrollBar 데이터 바인딩" Height="350" Width="525">

    <StackPanel >

        <!-- Source. -->

        <TextBox Name="txt1" Margin="24" />


        <!-- Target. -->

        <Label Name="label" HorizontalAlignment="Center" BorderBrush="Black" BorderThickness="2"/>

    </StackPanel></Window>

  • MainWindow.xaml.cs

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Controls.Primitives;


namespace BindingTextBoxToLabel

{

public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();


            Binding bind = new Binding();

            bind.Source = txt1;

            bind.Path = new PropertyPath(TextBox.TextProperty);

         // SetBinding의 첫 번째 인자는 DependencyProperty 타입이 되어야 한다.

         // 그러므로 타겟의 속성은 의존속성의 지원을 받는 속성이 되야 한다.

            label.SetBinding(Label.ContentProperty, bind);

        }

    }

}

  • 소스와 타겟의 의미는 소스 속성의 변화를 타겟의 속성에 반영되도록 하는 의미를 담고 있는데 바인딩 모드는 아래 4가지 입니다.

Content = “{Binding ElementName=txt1, Path=Text, Mode=OneWay}”

Binding의 Mode 속성의 기본값은 Default인데 Textbox처럼 사용자가 편집 가능한 컨트롤 속성의 기본값은 양방향 바인딩으로 설정되지만 대부분의 경우 기본값은 단방향 바인딩으로 설정됩니다.  

TwoWay로 설정할 수도 있는데 Label의 Content 프로퍼티의 변화도 TextBox의 Text 프로퍼티에 반영됩니다. 

OneTime 모드도 있는데 타겟이 소스로부터 초기화 되지만 소스의 변화가 계속 반영되지 않고 초기 한 번만 반영됩니다.

OneWayToSource 모드는 소스, 타겟의 의미가 반대가 되도록 타겟이 소스를 갱신하는 모양이다. 본 예제의 경우 Label은 TextBox에 넘겨줄 데이터가 없기에 Label은 비어 있고 TextBox의 Text 속성을 변경해도 반응이 없는 형태가 됩니다.

 

  • 이번에는 Label과 TextBox의 역할을 바꾸어 테스트 해보겠습니다.
  • 프로젝트 : BindingTextToLabel
  • MainWindow.xaml

<Window x:Class=" BindingTextBoxToLabel.MainWindow"

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

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

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

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

        xmlns:local="clr-namespace: BindingTextBoxToLabel "

        mc:Ignorable="d"

        Title="MainWindow" Height="350" Width="525">


    <StackPanel>

        <!-- Binding Target. -->

        <!-- UpdateSourceTrigger는 타겟이 소스를 갱신하는 타이밍을 지정-->

        <!-- TextBox인 경우 LostFocus가 기본이므로 값이 바뀔때마다 갱신하기위해 PropertyChanged로 설정-->

        <TextBox  Margin="24"                

               Text="{Binding ElementName=label, Path=Content, 

               UpdateSourceTrigger=PropertyChanged}" 

               />


        <!-- Binding Source. -->

        <Label Name="label" Content="대한민국"

        HorizontalAlignment="Center" BorderBrush="Black" BorderThickness="2"/>

    </StackPanel>


</Window>

  • Label이 소스가 되고 TextBox가 타겟이 되었는데 Label의 Content를 “대한민국”으로 설정했으므로 최초 TextBox의 Text 속성에 반영이 되었습니다.
  • TextBox의 값을 바꾸면 라벨 값이 갱신되는 TwoWay 바인딩이 기본적으로 설정되어 있는데, 만약 여기에서 Mode를 OneWay로 설정하면 TextBox의 값을 수정해도 라벨의 Content 프로퍼티는 갱신되지 않습니다. 

TextBox  Margin="24"                

Text="{Binding ElementName=label, Path=Content, UpdateSourceTrigger=PropertyChanged,

Mode=OneWay}" />

Mode를 OneWayToSource로 하면 동작합니다. 소스와 타겟을 바꾸어서 동작하기에 동작을 하는데, 현재 타겟인 TextBox를 수정하면 소스인 라벨에 반영이 되는 것입니다. TextBox의 Text 속성에 대해 초기값은 별도로 지정하지 않았으므로 빈 값이 Label에 반영되고 이후 TextBox의 Text속성을 수정하면 Label의 Content 속성이 바뀌게 됩니다.  

 

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


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

WPF학원교육, WPF 데이터 바인딩(Data Binding) 이란?

 WPF학원교육, WPF 데이터 바인딩(Data Binding) 이란?

  • 데이터 바인딩이란 “컨트롤 or 엘리먼트를 데이터에 연결시키는 기술”이다. 
  • 예문

//소스객체

<TextBox Name="txt1" Text="{Binding Mode=OneWay}" />


//타겟객체

<TextBox Name="txt2"  

Text="{Binding Source={x:Reference txt1},Path=Text}"/>

  • 데이터 바인딩은 소스와 타겟이 필요하며 일반적으로 소스는 데이터(ViewModel)이고 타겟은 컨트롤 입니다. 하지만 어느 경우엔 소스와 타겟 둘다 컨트롤이 될수가 있어 구분이 모호할 때도 있습니다. 또 어떤 경우에는 반대로 타겟이 소스에게 데이터를 전달하기도 합니다.
  • 모든 바인딩에는 소스 객체, 소스 속성, 타겟 객체 및 타겟 속성이 있습니다.
  • 타겟 객체는 바인딩 할 속성, 즉 데이터를 렌더링하는 UI 컨트롤을 소유하는 객체이며 소스 객체는 Binding Source속성 또는 ViewModel 클래스인 경우 DataContext 속성으로 지정하면 됩니다.
  • Binding.Source 속성을 통해 지정되는 원본 개체없이 정의 된 바인딩은 대상 개체의 DataContext를 원본으로 사용한다. 
  • DataContext 값은 한 컨트롤에서 다른 컨트롤로 비주얼 트리 아래로 상속되는데, 하위 객체에서 사용가능 합니다.
  • 데이터 바인딩은 이벤트 핸들러를 대체할 수 있는데 이는 C#코드를 줄이는 역할을 합니다. XAML에서 정의된 데이터 바인딩은 C# 코드 비하인드 파일에서 이벤트 핸들러를 정의할 필요가 없으며 코드 비하인드 파일 자체가 필요 없는 경우도 있습니다.
  • 컨트롤은 데이터를 사용자에게 보여주는 것과 사용자가 데이터를 변경할 수 있게 해주는 두 가지 기능을 제공합니다. 최근 컨트롤과 데이터 사이의 많은 반복 작업들이 단순화 되면서 CheckBox를 Boolean 변수로 바인딩하고 사용자가 작업이 끝난 후 Boolean 변수를 다시 CheckBox 값으로 바인딩하는 코드들을 만들어야 했는데 아래처럼 CheckBox와 Bool 변수 사이를 데이터바인딩을 이용하게 간단하게 처리할 수 있습니다.
  • 예문.

[MainWindow.xaml]

<StackPanel Orientation="Vertical" Margin="20" >

        <Label Content="Which city do you love?"/>

        <CheckBox Content="SEOUL" IsChecked="{Binding Seoul}"/>

        <CheckBox Content="JEJOO" IsChecked="{Binding Jejoo}"/>

        <CheckBox Content="INCHEON" IsChecked="{Binding Incheon}"/>

        <Button Content="제출" Click="Sumit_Click"/>

</StackPanel>


[MainWindow.xaml.cs]

public partial class MainWindow : Window

{

//UI 컨트롤에서 바인딩으로 사용할 소스 속성들

public bool Seoul { get; set; }

public bool Jejoo { get; set; }

public bool Incheon { get; set; }


public MainWindow()

{

      this.InitializeComponent();

      //바인딩의 소스객체, UI컨트롤에서 별도의 소스 지정없이 사용가능

      //Window의 하위객체에서 소스 속성으로 사용가능

      this.DataContext = this; 

}


//버튼의 클릭 이벤트 핸들러

private void Sumit_Click(object sender, RoutedEventArgs e)

{

      MessageBox.Show(string.Format("SEOUL: {0}, JEJOO: {1}, INCHEON: {2}", Seoul, Jejoo, Incheon));

}


}


 


  • 다음은 TextBox간의 단방향 데이터 바인딩 예문을 살펴보자.
  • 아래 예문은 별도의 C#코드는 필요 없다. txt1이 소스 객체가 되고 txt2가 타겟 객체가 되어 소스의 Text 속성의 값을 타겟 txt2의 Text 속성에 바인딩 시킨다.

<StackPanel Orientation="Vertical" Margin="20" >

        <TextBox Name="txt1"  Text="{Binding Mode=OneWay}" />

        <TextBox Name="txt2"  

Text="{Binding Source={x:Reference txt1},Path=Text}"/>

</StackPanel>

위쪽 TextBox에 값을 입력하며 아래쪽 TextBox에 자동 입력된다.

  • 위 코드를 수정하여 양방향바인딩으로 만들어보자.
  • 위쪽 TextBox에서 입력을 하면 아래에 자동 반영 되지만, 아래쪽 TextBox에서 입력을 하면 바로 반영은 안되고 포커스를 잃는경우에만 하는 경우에 상단의 TextBox에 반영된다. (양방향에서 타겟이 소스를 UPDATE하는 타이밍은 UpdateSourceTrigger 속성으로 지정하는데 대부분의 의존 속성 기본값이 PropertyChanged인 반면 Text 속성은 기본값이 LostFocus 입니다.)

<TextBox Name="txt1"  Text="{Binding Path=Text, Mode=TwoWay}" />

        <TextBox Name="txt2"  

Text="{Binding Source={x:Reference txt1},Path=Text}"/>


최종적으로 아래와 같이 UpdateSourceTrigger 절을 타겟객체쪽에 추가하자. 소스를 갱신할 타이밍을 지정하는 곳이고 Text 속성인 경우 기본값은 포커스를 잃을 때(LostFocus)이다.

<TextBox Name="txt1"  Text="{Binding Path=Text, Mode=TwoWay}" />

<TextBox Name="txt2"  

Text="{Binding Source={x:Reference txt1},Path=Text, 

UpdateSourceTrigger =PropertyChanged}"/>

다른 예문을 살펴보자.

public partial class MainWindow {

public MainWindow()

{

  InitializeComponent();


  // create a model object

  _viewmodel = new MyViewModel()

  {

    Date = new DateTime(201171),

    Title = "WPF User Group"

  };


  // bind the Date to the UI

  this.DataContext = _viewmodel;

}

}


<Grid x:Name="LayoutRoot" Background="White">

  ...


  <TextBlock Text="Name:"

              Grid.Row="1"/>

  <TextBox Text="{Binding Path=Title, Mode=TwoWay}"

           Grid.Row="1" Grid.Column="1"/>


  <TextBlock Text="Date:"

              Grid.Row="2"/>

  <sdk:DatePicker SelectedDate="{Binding Path=Date, Mode=TwoWay}"

                  Grid.Row="2" Grid.Column="1"/>

</Grid>


  • XAML에서 바인딩 인스턴스를 만들 수 있다 

<TextBox Text="{Binding Path=Text}"/>

아래처럼 표기할 수도 있다.

<TextBox>

  <TextBox.Text>

    <Binding Path="Text"/>

  </TextBox.Text>

</TextBox>

  • 바인딩을 더 간단하게 만들고 싶다면 Path를 생략하고 다음과 같이 바인딩을 간단히 표현할 수 있다.

<TextBox Text="{Binding Text}"/>

  • 소스 (예 : DataContext)의 속성에 바인딩하지 않고 소스객체 자체에 바인딩 하려는 경우는 “점(Dot)”을 사용하면 된다.

<TextBox Text="{Binding Path=.}"/>

  • 또는 이경우 아래와 같이 Binding 구문만 사용할 수 도 있다.


<TextBox Text="{Binding}"/>

 
#데이터바인딩, #WPF데이터바인딩, #WPF교육, #WPF강좌, #WPF학원, #DataBinding, #WPFDataBinding


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

WPF교육, WPF학원, WPF 버튼(Button)과 Control

 WPF교육, WPF학원, WPF 버튼(Button)과 Control


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


WPF교육, WPF학원, WPF 버튼(Button)과 Control

WPF교육, WPF학원, WPF 버튼(Button)과 ControlControl 클래스는 FrameworkElement를 직접 상속받으며 UI를 위한 기본클래스를 정의하는데 상속 계층 구조는 다음과 같다.Namespace:System.Windows.ControlsAssembly:Presentati

ojc.asia

https://www.youtube.com/watch?v=Ycb2Tg56l-M&list=PLxU-iZCqT52Cmj47aKB1T-SxI33YL7rYS&index=17&t=3s 

Namespace:   System.Windows.Controls
Assembly:  PresentationFramework (in PresentationFramework.dll)

System.Object
  System.Windows.Threading.DispatcherObject
    System.Windows.DependencyObject
      System.Windows.Media.Visual
        System.Windows.UIElement
          System.Windows.FrameworkElement
            System.Windows.Controls.Control
              System.Activities.Presentation.Toolbox.ToolboxControl
              System.Windows.Controls.Calendar
              System.Windows.Controls.ContentControl
              System.Windows.Controls.DataGridRow
              System.Windows.Controls.DatePicker
              System.Windows.Controls.FlowDocumentReader
              System.Windows.Controls.FlowDocumentScrollViewer
              System.Windows.Controls.ItemsControl
              System.Windows.Controls.KeyTipControl
              System.Windows.Controls.PasswordBox
              System.Windows.Controls.Primitives.CalendarItem
              System.Windows.Controls.Primitives.DocumentViewerBase
              System.Windows.Controls.Primitives.RangeBase
              System.Windows.Controls.Primitives.ResizeGrip
              System.Windows.Controls.Primitives.TextBoxBase
              System.Windows.Controls.Primitives.Thumb
              System.Windows.Controls.Ribbon.RibbonContextualTabGroup
              System.Windows.Controls.Ribbon.RibbonTwoLineText
              System.Windows.Controls.Separator
              System.Windows.Controls.StickyNoteControl

 

  • Window는 ContentControl을 거쳐서 Control을 상속 받았으므로 FrameworkElement와 Control의 일부 프로퍼티에 대해 사용 가능한데 Control에 정의된 프로퍼티는 Background, Foreground, BorderBrush, BorderThicknees, FontWeight등이 있다. 
  • TextBlock도 폰트와 관련된 프로퍼티가 있지만 Control을 상속받지 않았고 자체적으로 정의해서 사용하고 있다.
  • Control을 상속받은 클래스는 주로 버튼, 리스트박스, 스크롤바, 에디터필드, 메뉴, 툴바와 같은 기능을 제공하며 이 클래스들은 System.Windows.Controls, System.Windows.Controls.Primitives 네임스페이스에 있으며 여기에는 Control을 상속하지 않은 클래스들도 정의되어 있다.
  • 컨트롤 중 가장 자주 사용되는 버튼은 WPF에서 Button으로 표시하며 Click 이벤트는 마우스를 클릭시 호출되는 이벤트이다.
  • 버튼의 Content 프로퍼티에는 텍스트 문자열을 할당하고 Button 객체 그 자체는 Window의 Content 프로퍼티에 할당되고 할당되는 순서는 중요하지 않다.
  • Window 처럼 Button도 Content 프로퍼티가 있는 이유는 두 클래스 모두 ContentControl을 상속받고 있기 때문이다.

 

다음은 Button 클래스의 상속 계층 구조이다.

 

Namespace:   System.Windows.Controls
Assembly:  PresentationFramework (in PresentationFramework.dll)
 

System.Object
  System.Windows.Threading.DispatcherObject
    System.Windows.DependencyObject
      System.Windows.Media.Visual
        System.Windows.UIElement
          System.Windows.FrameworkElement
            System.Windows.Controls.Control
              System.Windows.Controls.ContentControl
                System.Windows.Controls.Primitives.ButtonBase
                  System.Windows.Controls.Button
                    System.Activities.Presentation.PropertyEditing.EditModeSwitchButton
                    System.Windows.Controls.Primitives.CalendarButton
                    System.Windows.Controls.Primitives.CalendarDayButton
                    System.Windows.Controls.Ribbon.RibbonButton

 

  • 마우스의 움직임에 따라 서식있는 문자열의 프로퍼티를 다루는 예제를 만들어 보자.
  • WPF 응용프로그램 프로젝트 생성 후 MainWindow.xaml.cs 파일을 수정하자.

 

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;


namespace ButtonTest1

{

    public partial class MainWindow : Window

    {

        //Run 클래스는 텍스트의 실행을 포함하기 위한 인라인 요소를 정의

        Run runButton1;

        Run runButton2;


        public MainWindow()

        {

            InitializeComponent();


            Title = "ButtonTest1";


            // Create the Button and set as window content.

            Button btn = new Button();

            btn.HorizontalAlignment = HorizontalAlignment.Center;

            btn.VerticalAlignment = VerticalAlignment.Center;

            btn.MouseEnter += ButtonOnMouseEnter;

            btn.MouseLeave += ButtonOnMouseLeave;

            Content = btn;


            // Create the TextBlock and set as button content.

            TextBlock txtblk = new TextBlock();

            txtblk.FontSize = 24;

            txtblk.TextAlignment = TextAlignment.Center;

            btn.Content = txtblk;


            // 서식화된 텍스트 출력

            txtblk.Inlines.Add(new Italic(new Run("Click")));

            txtblk.Inlines.Add(" the ");

            txtblk.Inlines.Add(runButton1 = new Run("button"));

            txtblk.Inlines.Add(new LineBreak());

            txtblk.Inlines.Add("to launch the ");

            txtblk.Inlines.Add(new Bold(runButton2 = new Run("rocket")));

        }


        //마우스가 버튼 안으로 들어가면 Run(runButton)객체의 Foreground 프로퍼티가 빨강으로 된다.

        void ButtonOnMouseEnter(object sender, MouseEventArgs args)

        {

            runButton1.Foreground = Brushes.Red;

            runButton2.Foreground = Brushes.Blue;

        }


        //마우스가 빠져 나가면 SystemColors.ControlTestBrush로 부터 기본텍스트 색을 얻어와 설정한다.

        void ButtonOnMouseLeave(object sender, MouseEventArgs args)

        {

            runButton1.Foreground = SystemColors.ControlTextBrush;

            runButton2.Foreground = SystemColors.ControlTextBrush;

        }

    }

}

 

  • 실행화면

 

 

  • WPF에서 흔히 리소스는 어셈블리 리소스(Assembly Resource)로 비주얼 스튜디오 프로젝트의 일부로 만들어지는 것을 말하며 실행파일이나 DLL의 일부가 된다. 
  • 이미지 버튼을 만들어 보는데 이미지를 URL에서 가지고 오지 않고 Resource로써 실행파일 안에 같이 빌드하는 예제를 작성해 보자.
  • ButtonTest2라는 WPF 프로젝트를 생성하자.
  • 다음으로 PC의 적당한 이미지를 리소스로 추가해야 되는데 프로젝트에서 마우스 우측버튼 추가 -> 기존 항목 추가 선택 후 적당한 이미지를 선택하자. 그런 다음 추가된 이미지의 속성에서 빌드작업 -> Resource로 되어 있는지 확인하자.

 

 

  • MainWindow.xaml.cs

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Media;

using System.Windows.Media.Imaging;


namespace ButtonTest2

{

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();


            Title = "Image the Button";


            Uri uri = new Uri("pack://application:,,,/title.png");

            BitmapImage bitmap = new BitmapImage(uri);


            Image img = new Image();

            img.Source = bitmap;


            // 할당된 공간을 채우기 위해 이미지의 크기를 조정하는 방법을 제공

             // None : 원래 크기를 그대로 유지

             // Uniform : 원래의 가로 세로 비율을 유지하면서 대상 크기에 맞게 

//           콘텐츠 크기가 조정됩니다.

// UniformToFill : 원래의 가로 세로 비율을 유지하면서 대상 크기에 맞게

//               콘텐츠 크기가 조정됩니다. 대상 사각형의 가로 세로 비율이 

//               원본과 다를 경우 원본 콘텐츠가 대상 크기에 맞게 잘린다.

            img.Stretch = Stretch.None;            


            Button btn = new Button();

            btn.Content = img;

            btn.HorizontalAlignment = HorizontalAlignment.Center;

            btn.VerticalAlignment = VerticalAlignment.Center;            


            Content = btn;

        }

    }

}

 

  • 실행 화면

 

  • 하나의 이미지를 여러곳에서 사용할 때는 이미지를 리소스로 등록하여 한번만 로드 시킨 후 BitmapImage로 만들고 StaticResource로 공유해서 사용하면 된다.

<BitmapImage x:Key="ImageSource1" UriSource="../images/Image.png" />

……


<Image Source="{StaticResource ImageSource1}" />

 
#WPF버튼, #WPF교육, #WPF학원, #WPF컨트롤, #WPF, #WPF동영상
WPF버튼, WPF교육, WPF학원, WPF컨트롤, WPF, WPF동영상


(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...