728x90

이미지 등록 방법에 대해 알아 보겠습니다.

간단하니 30초만 투자하세요.


이미지 등록을 하시려면 Properties -> Resources.resx 더블클릭합니다.


이미지를 넣기 위해 이미지를 선택 한 후 폴더에 있는 이미지 파일을 끌어와서 올려주시면 됩니다.


끌어온 이미지는 다음과 같이 Resources 폴더가 생성되고, 그안에 이미지 파일이 들어있습니다.


이 이미지 파일을 사용하려면 <Image Source="/Resources/NEO.PNG"/> 라고 작성을 해주시면 됩니다.


주의점은 이렇게만 하고, 밑 부분을 안하시고 넘어가면 지금은 이미지가 화면에 보이지만 실제 실행화면에서는
이미지가 안보이기 때문에, 꼭 밑에 부분도 적용 하시기 바랍니다.


이미지 파일 선택 후 속성 버튼을 눌러보면 빌드 작업이라는 것을 볼 수 있습니다.

빌드 작업이 없음으로 되어있기 때문에, 이미지를 보실 수 없습니다.


빌드 작업을 선택하여, Resource를 선택합니다.


그러면, 실행 되었을 경우에도 이미지 파일을 보실수 있습니다.

728x90
728x90

발생 전 상황
실시간 타이머를 사용 하려고 하였으나, .exe 종료와 함께 액세스 할 수 없다는 파업창이 발생 하였습니다.

 

발생 원인
데이터를 수신하는 스레드에서 프로그램 화면을 갱신시 문제가 발생.



원인 해결 방법
Dispatcher.Invoke(DispatcherPriority, Delegate)을 사용하여 주세요.
 - [[여기]] 선택하시면 더욱 자세한 설명을 볼 수 있습니다.
 - Dispatcher가 연결된 스레드에서 지정된 대리자를 동기적으로 실행합니다.
그러면 메인스레드와 동기화 되어 진행이 됩니다.

 

마무리.
txthour.Text = sqptime.ToString();
Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { txthour.Text = sqptime.ToString(); }));
으로 변경하여 진행 하였더니, 이상없이 잘 진행 되었습니다.

 

네임페이스는 System.Windows.Threading 입니다.

728x90
728x90

소개
.NET Framework와 .NET Core에서 무엇을 선택 해야만 하는가?

 

 

.NET Framework 이점
· 아무것도 모르는 상태에서, 빠르게 진행이 필요 할 경우, .NET Framework를 선택하세요.
 - .NET Core의 경우는 학습이 조금 더 어렵습니다.
· .NET Framework는 현재 버전인 4.8이 마지막 버전으로 간주됩니다.
 - 지속적인 업그레이드와 변경을 하고 싶지 않을 경우 선택하세요.
· 일하는데 안정적인 환경을 줍니다.

.NET Core 장점
· 새로운 프로그램을 구축해야 한다면 .NET Framework보다는 .NET Core이 좋습니다.
 - 마이크로 소프트사에서는 .NET Core v3.0을 발표했습니다.
  - 미래의 경우 .NET Core가 될 수 있습니다.
· .NET Core 3.0 발표
 - WPF에서 Windows Forms을 지원합니다.
   즉. UWP/WPF 및 Windows Forms 간의 교차 개발도 지원합니다.
   이것은 최신 UWP 인터페이스를 Windows Forms 및 WPF로 가져올 수 있는 유연성을 제공합니다. 

 

.NET 생태계
.Net Core
· 윈도우, 리눅스, macOS 사용 가능합니다.
 - 모든 운영 체제에 대한 응용 프로그램을 구축하기 위한 새로운 오픈 소스 및 크로스 플랫폼 프레임 워크 입니다.
 - UWP 및 ASP.NET Core 만 지원합니다.
 - ASP.NET Core는 브라우저 기반 웹 응용 프로그램을 작성하는 데 사용합니다.
· 경량화로 인해 매우 가볍다
· Docker 사용 가능

.Net Framework
· 윈도우 및 웹 응용 프로그램을 사용 가능합니다.
 -  Windows Forms, WPF/UWP를 사용하여 Windows 응용 프로그램을 빌드 할 수 있습니다. 
  - ASP.NET MVC는 웹 응용 프로그램 작성에 사용합니다.
· 다양한 기능과 확장성을 지원

 

 


ps. 인용 https://www.c-sharpcorner.com/article/difference-between-net-framework-and-net-core/

728x90
728x90

1. 목표

쉽고 간단한 이메일 보내기를 만들고자 합니다.

App 안에서 메일을 작성하여 자동으로 등록된 이메일 주소로 보내고자 합니다.

이메일을 보내기 위해서 아웃룩(outlock) 이메일을 이용 하여, 메일을 보낼 것입니다.

 

2. 코더

SendEmail.xaml

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>
        <TextBlock Text="Send Mail" FontSize="25" Grid.Row="0" FontWeight="Bold"/>
        <TextBlock Margin="5,10,0,0" Text="To" Grid.Row="1" FontSize="20"/>
        <TextBlock Margin="0,10,10,0" Name="tomail" Grid.Column="1" Grid.Row="1"
                   Text="주 Eamil은 등록되어 있으므로, 작성 할 수 없습니다."/>
        <TextBlock Margin="5,10,0,0" Text="CC" Grid.Row="2" FontSize="20"/>
        <TextBox Margin="0,10,10,0" Name="ccmail" Grid.Column="1" Grid.Row="2"
                 PlaceholderText="참조하려는 Email 작성하세요."/>
        <TextBlock Margin="5,10,0,0" Text="Subject" Grid.Row="3" FontSize="20"/>
        <TextBlock Margin="0,10,10,0" x:Name="subject" Grid.Column="1" Grid.Row="3"
                   Text="자동으로 현재 날짜인 월과 일이 표시 됩니다."/>
        <TextBlock Margin="5,10,0,0" Text="Body" Grid.Row="4" FontSize="20"/>
        <TextBox Margin="0,10,10,0" Name="body" Grid.Column="1" Grid.Row="4" Height="100" TextWrapping="Wrap"
                 PlaceholderText="내용을 입력하세요."/>
        <Button Margin="0,10,10,0" HorizontalAlignment="Left" Content="Send" Name="sendEmail"
                Grid.Column="1" Grid.Row="5" Click="SendEmail_Click"/>        
  

 

 

SendEmail.xaml.cs

private async void SendEmail_Click(object sender, RoutedEventArgs e)
        {

            string ccmailstr = ccmail.Text.ToString();
            EmailMessage email = new EmailMessage();
            email.To.Add(new EmailRecipient(tomail.Text = "J'code@gmail.com"));

            if (ccmail.Text.Length == 0) //CC에 대한 내용이 없어도 오류가 나지 않도록 예외 처리
            {
                System.Diagnostics.Debug.WriteLine("CC = 0");
            }
            else
            {
                email.CC.Add(new EmailRecipient(ccmail.Text)); System.Diagnostics.Debug.WriteLine("CC != 0");
            }

            subject.Text = DateTime.Now.ToString("yyy/MM/dd 자료입니다. ");
            email.Subject = subject.Text;
            email.Body = body.Text;

            await EmailManager.ShowComposeNewEmailAsync(email);            
        }

 

3. 결과

 

내용을 입력하고 보낼 경우!

 

내용을 입력하지 않고, Send Button 눌렀을 경우!

 

이메일에서 첨부파일을 추가하고 싶다면, ▶ https://clear-sky-sun.tistory.com/10 ◀을 확인 해주세요.

728x90
728x90

1. 구성

페이지에서 다른 페이지로 넘기는 데이터 넘기는 네비게이션 사용방법에 대해서 알아보고자 합니다.

구성은 페이지2 세트와 클래스 1개로 이루어져있습니다.

프로그램 실행은 압축 파일을 통하여서도 실행이 가능합니다. 

 

2. 코더

MainPage.xaml

	<StackPanel >
            <StackPanel.Resources>
                <Style TargetType="Button">
                    <Setter Property="Width" Value="200"/>
                    <Setter Property="Margin" Value="0,10,0,0"/>
                </Style>
            </StackPanel.Resources>
            <StackPanel Orientation="Vertical" Padding="150">
                <TextBox x:Name="MainName1" PlaceholderText="1번째" FontSize="35" />
                <TextBox x:Name="MainName2" Text="2번째" FontSize="35" />
                <Button x:Name="btnname1" Content="Blank Page로 이동합니다." Click="Btnname1_Click"/>
            </StackPanel>
            <StackPanel Margin="150,50,0,0" Orientation="Vertical">
                <Button x:Name="btnGo" Content="글자 이동" Click="BtnGo_Click"/>
                <TextBlock x:Name="MainBlock1" Text="첫번째." FontSize="35"/>
                <TextBlock x:Name="MainBlock2" Text="두번째." FontSize="35"/>
            </StackPanel>
        </StackPanel>

MainPage.xaml.cs

        private void Btnname1_Click(object sender, RoutedEventArgs e)
        {
	    this.Frame.Navigate(typeof(BlankPage), this.MainBlock2.Text);
            this.Frame.Navigate(typeof(BlankPage), this.MainBlock1.Text);
        }

        private void BtnGo_Click(object sender, RoutedEventArgs e)
        {
            var student = new Student { MainName1 = MainName1.Text, MainName2 = MainName2.Text};
            Frame frame = Window.Current.Content as Frame;
            frame.Navigate(typeof(BlankPage), student);

            MainBlock1.Text = String.Format("{0}", MainName1.Text);
            MainBlock2.Text = String.Format("{0}", MainName2.Text);
        }

 

BlankPage.xaml

	<StackPanel Margin="150" Orientation="Vertical">
            <TextBox x:Name="BlankName1" Text="----" FontSize="35" />
            <TextBox x:Name="BlankName2" Text="123" FontSize="35" />
            <Button x:Name="Back" Content="뒤로가기" Click="Back_Click"/>
        </StackPanel>

BlankPage.xaml.cs

public BlankPage()
        {
            this.InitializeComponent();
        }    

        private void Back_Click(object sender, RoutedEventArgs e)
        {
            Frame.Navigate(typeof(MainPage));
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            var student = (Student)e.Parameter;

            if(!string.IsNullOrWhiteSpace(student.MainName1))
            {
                BlankName1.Text = student.MainName1;
                BlankName2.Text = student.MainName2;
            }
         }

 

Student.cs

 public class Student
    {
        public string MainName1 { get; set; }
        public string MainName2 { get; set; }
    }

 

3. 압축파일

파일이 필요하신 분은 댓글 주세요.

navigate.zip
2.54MB

728x90
728x90

1. 구성

각 Button에는 "안녕하세요."와 "오늘 날씨는 맑음이네요."가 등록이 되어 있습니다.

해당 Button을 누른다면, 해당하는 글자가 TextBox에 작성 될 것입니다.

처음 이용하시는 분들을 위하여 PlaceholderText를 통하여 Hint를 주었습니다.

 

2. 코더

        <StackPanel >
            <StackPanel.Resources>
                <Style TargetType="Button">
                    <Setter Property="Width" Value="200"/>
                    <Setter Property="Margin" Value="0,10,0,0"/>
                </Style>
            </StackPanel.Resources>
            <StackPanel Orientation="Vertical" Padding="150">
                <TextBox x:Name="name" PlaceholderText="해당 Button을 누르면 버튼에 적힌 글자가 TextBox에 작성 됩니다." />
                <Button x:Name="btnname1" Content="안녕하세요." Click="Btnname1_Click"/>
                <Button x:Name="btnname2" Content="오늘 날씨는 맑음이네요." Click="Btnname2_Click"/>
            </StackPanel>
        </StackPanel>
	private void Btnname1_Click(object sender, RoutedEventArgs e)
        {
            name.Text = "안녕하세요.";
        }

        private void Btnname2_Click(object sender, RoutedEventArgs e)
        {
            name.Text = "오늘 날씨는 맑음이네요.";
        }

 

3. 결과

 

728x90
728x90

1.안내

예전에 초보자들도 쉽게 만들수 있는 계산기

초보자 누구나 할 수 있는 간단하지만 알찬 계산기!!

코더만 보시더라도 알만한 내용이니 처음 UWP나 WPF 시작하시는 분이 보면 좋을 거 같습니다.

설명은 주석을 참고하시면 되며, Windows Forms에서 사용하기는 약간 다른부분이 있으니, 그점만 참고하시면 될 거 같습니다.

자 그럼 지금부터 진행하겠습니다.

 

2. 코더

MainPage.xaml

         <StackPanel Orientation="Vertical" Margin="77">
            <StackPanel Orientation="Vertical" HorizontalAlignment="Center" >
                <StackPanel Orientation="Horizontal" Width="400" Height="50" >
                    <TextBlock Text="입력 :" FontSize="30" />
                    <TextBlock x:Name="Input_Box" FontSize="30" Width="330"/>
                </StackPanel>
                <StackPanel Orientation="Horizontal" Width="400" Height="50">
                    <StackPanel Orientation="Horizontal" Width="400" Height="50">
                        <TextBlock Text="결과 :" FontSize="30"/>
                        <TextBlock x:Name="Result_Box" FontSize="30" Width="330"/>
                    </StackPanel>
                </StackPanel>
            </StackPanel>
            <StackPanel Orientation="Vertical" Margin="15">
                <StackPanel Orientation="Horizontal" Width="280">
                    <Button x:Name="btn1" Content="1" FontSize="30" Width="50" Height="50" Margin="10" Click="Btn1_Click"/>
                    <Button x:Name="btn2" Content="2" FontSize="30" Width="50" Height="50" Margin="10" Click="Btn2_Click"/>
                    <Button x:Name="btn3" Content="3" FontSize="30" Width="50" Height="50" Margin="10" Click="Btn3_Click"/>
                    <Button x:Name="btn4" Content="4" FontSize="30" Width="50" Height="50" Margin="10" Click="Btn4_Click"/>
                </StackPanel>
                <StackPanel Orientation="Horizontal" Width="280">
                    <Button x:Name="btn5" Content="5" FontSize="30" Width="50" Height="50" Margin="10" Click="Btn5_Click"/>
                    <Button x:Name="btn6" Content="6" FontSize="30" Width="50" Height="50" Margin="10" Click="Btn6_Click"/>
                    <Button x:Name="btn7" Content="7" FontSize="30" Width="50" Height="50" Margin="10" Click="Btn7_Click"/>
                    <Button x:Name="btn8" Content="8" FontSize="30" Width="50" Height="50" Margin="10" Click="Btn8_Click"/>
                </StackPanel>
                <StackPanel Orientation="Horizontal" Width="280">
                    <Button x:Name="btn9" Content="9" FontSize="30" Width="50" Height="50" Margin="10" Click="Btn9_Click"/>
                    <Button x:Name="btn0" Content="0" FontSize="30" Width="50" Height="50" Margin="10" Click="Btn0_Click"/>
                    <Button x:Name="btn_plue" Content="+" FontSize="30" Width="50" Height="50" Margin="10" Click="Btn_plue_Click"/>
                    <Button x:Name="btn_minus" Content="-" FontSize="30" Width="50" Height="50" Margin="10" Click="Btn_minus_Click"/>
                </StackPanel>
                <StackPanel Orientation="Horizontal" Width="280">
                    <Button x:Name="btn_Reset" Content="Reset" FontSize="30" Width="120" Height="50" Margin="10" Click="Btn_Reset_Click"/>
                    <Button x:Name="btn_multiply" Content="*" FontSize="30" Width="50" Height="50" Margin="10" Click="Btn_multiply_Click"/>
                    <Button x:Name="btn_division" Content="/" FontSize="30" Width="50" Height="50" Margin="10" Click="Btn_division_Click"/>
                </StackPanel>
            </StackPanel>
        </StackPanel>

 

MainPage.xaml.cs

public int Result = 0; //현재 최종 결과 0
public bool isNum = true; //더하기 버튼 클릭하면 새로운 숫자를 입력 받는다.

private void Btn_Reset_Click(object sender, RoutedEventArgs e)
        {
            Result = 0;
            isNum = true;
            Input_Box.Text = "0";
            Result_Box.Text = "0";
        }

        private void Btn_multiply_Click(object sender, RoutedEventArgs e)
        {
            int num = int.Parse(Input_Box.Text); //string 타입을 int형으로 변경 Parse
            Result = Result * num;

            Result_Box.Text = Result.ToString();
            isNum = true;
        }

        private void Btn_division_Click(object sender, RoutedEventArgs e)
        {
            int num = int.Parse(Input_Box.Text);
            Result = Result / num;

            Result_Box.Text = Result.ToString();
            isNum = true;
        }

        private void Btn_minus_Click(object sender, RoutedEventArgs e)
        {
            int num = int.Parse(Input_Box.Text);
            Result = Result - num;

            Result_Box.Text = Result.ToString();
            isNum = true;
        }

        private void Btn_plue_Click(object sender, RoutedEventArgs e)
        {
            int num = int.Parse(Input_Box.Text);
            Result = Result + num;

            Result_Box.Text = Result.ToString();
            isNum = true;
        }

        private void Btn0_Click(object sender, RoutedEventArgs e)
        {
            if(isNum) //isNum :: 새로운 넘버인가?
            {
                Input_Box.Text = ""; //새로운 넘버라면 Input_Box 원래 있던거에 공백이 들어간다.
                isNum = false;
            }

            Input_Box.Text = Input_Box.Text + "0"; // + "0"을 주어 버튼 0을 두번재 눌러도 0이 나온다.
        }

        private void Btn9_Click(object sender, RoutedEventArgs e)
        {
            if (isNum) 
            {
                Input_Box.Text = "";
                isNum = false;
            }

            Input_Box.Text = Input_Box.Text + "9";
        }

        private void Btn8_Click(object sender, RoutedEventArgs e)
        {
            if (isNum) 
            {
                Input_Box.Text = ""; 
                isNum = false;
            }

            Input_Box.Text = Input_Box.Text + "8";
        }

        private void Btn7_Click(object sender, RoutedEventArgs e)
        {
            if (isNum)
            {
                Input_Box.Text = "";
            }

            Input_Box.Text = Input_Box.Text + "7";
        }

        private void Btn6_Click(object sender, RoutedEventArgs e)
        {
            if (isNum)
            {
                Input_Box.Text = "";
                isNum = false;
            }

            Input_Box.Text = Input_Box.Text + "6";
        }

        private void Btn5_Click(object sender, RoutedEventArgs e)
        {
            if (isNum)
            {
                Input_Box.Text = "";
                isNum = false;
            }

            Input_Box.Text = Input_Box.Text + "5";
        }

        private void Btn4_Click(object sender, RoutedEventArgs e)
        {
            if (isNum)
            {
                Input_Box.Text = "";
                isNum = false;
            }

            Input_Box.Text = Input_Box.Text + "4";
        }

        private void Btn3_Click(object sender, RoutedEventArgs e)
        {
            if (isNum)
            {
                Input_Box.Text = "";
                isNum = false;
            }

            Input_Box.Text = Input_Box.Text + "3";
        }

        private void Btn2_Click(object sender, RoutedEventArgs e)
        {
            if (isNum)
            {
                Input_Box.Text = "";
                isNum = false;
            }

            Input_Box.Text = Input_Box.Text + "2";
        }

        private void Btn1_Click(object sender, RoutedEventArgs e)
        {
            if (isNum)
            {
                Input_Box.Text = "";
                isNum = false;
            }

            Input_Box.Text = Input_Box.Text + "1";
        }
    }

 

3. 결과

728x90
728x90

데이터 바인딩의 이해를 위해 간단하게 https://clear-sky-sun.tistory.com/3에서 설명을 확인 할 수 있습니다.

 

1. 구성

단방향 바인딩과, 양방향 바인딩에 대해 실습을 해보려고 합니다.

간단한 실습을 통해, 코더를 하나씩 작성하여, 이해 하시기 바랍니다.

 

2. 단반향 바인딩 진행

One_Way_Data_Binding.xaml

	<Grid>
        <StackPanel Name = "Display">
            <StackPanel Orientation = "Horizontal" Margin = "50, 50, 0, 0">
                <TextBlock Text = "Name : " Margin = "10" Width = "100"/>
                <TextBlock Margin = "10" Width = "100" Text = "{Binding Name}"/>
            </StackPanel>

            <StackPanel Orientation = "Horizontal" Margin = "50,0,50,0">
                <TextBlock Text = "Age : " Margin = "10" Width = "100"/>
                <TextBlock Margin = "10" Width = "200" Text = "{Binding Age}" />
            </StackPanel>
        </StackPanel>
    </Grid>

One_Way_Data_Binding.xaml.cs

public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            DataContext = Et.GetEt();
        }
    }

    public class Et
    {
        public string Name { get; set; }
        public string Age { get; set; }

        public static Et GetEt()
        {
            var emp = new Et()
            {
                Name = "Gelato",
                Age = "20's"
            };
            return emp;
        }
    }

 

결과

 

3. 양방향 바인딩 진행

Tow_Way_Data_Binding.xaml

        <Grid.RowDefinitions>
            <RowDefinition Height = "Auto" />
            <RowDefinition Height = "Auto" />
            <RowDefinition Height = "*" />
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width = "Auto" />
            <ColumnDefinition Width = "200" />
        </Grid.ColumnDefinitions>

        <TextBlock Name = "nameLabel" Margin = "200,20,0,0">Name:</TextBlock>

        <TextBox Name = "nameText" Grid.Column = "1" Margin = "10,20,0,0" 
         Text = "{Binding Name, Mode = TwoWay}"/>

        <TextBlock Name = "ageLabel" Margin = "200,20,0,0" 
         Grid.Row = "1">Age:</TextBlock>

        <TextBox Name = "ageText" Grid.Column = "1" Grid.Row = "1" Margin = "10,20,0,0" 
         Text = "{Binding Age, Mode = TwoWay}"/>

        <StackPanel Grid.Row = "2" Grid.ColumnSpan = "2">
            <Button Content = "Display" Click = "Button_Click"  
            Margin = "200,20,0,0"/>
            <TextBlock x:Name = "txtblock" Margin = "200,20,0,0"/>
        </StackPanel>

Tow_Way_Data_Binding.xaml.cs

using Windows.UI.Xaml.Controls;


public sealed partial class MainPage : Page
    {
        Person person = new Person { Name = "철수", Age = 27 };

        public MainPage()
        {
            this.InitializeComponent();
            this.DataContext = person;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            string message = person.Name + " is " + person.Age + " years old";
            txtblock.Text = message;
        }
    }
    public class Person
    {
        private string nameValue;

        public string Name
        {
            get { return nameValue; }
            set { nameValue = value; }
        }

        private double ageValue;

        public double Age
        {
            get { return ageValue; }

            set
            {
                if (value != ageValue)
                {
                    ageValue = value;
                }
            }
        }
    }

 

결과

728x90
728x90

Model View Controller (MVC)?

model이란?

어떠한 동작을 수행하는 코드를 말한다. 표시 형식에 의존하지 않는다.

사용자에게 어떻게 보일지 신경을 안써도 된다. public 함수로 이루어진다.

view이란?

모델로부터 값을 가져와 사용자에게 보여준다.

controller이란?

사용자는 컨트롤러를 사용하여 모델의 상태를 바꾼다.

컨트롤러는 모델의 mutator 함수를 호출하여 상태를 바꾼다.

모델의 상태가 바뀌면 모델은 등록된 뷰에 자신의 상태가 바뀌었다는 것을 알리고 뷰는 거기에 맞게 사용자에게 모델의 상태를 보여준다.

 

Binding 구조?

- UI 요소를 의미하는 바인딩 대상

- 데이터를 의미하는 바인딩 소스

- 둘 사이를 관계를 맺어누는 바인딩 개체

Binding 방식?

OneWay방식

- 바인딩 소스를 바인딩 대상에 바인딩 하였다면, 바인딩 대상의 값이 변경되면 바인딩 소스 값도 변경 된다.

하지만, 바인딩 소스 값이 변경 되었다면 바인딩 대상의 값은 변경되지 않는다.

TwoWay방식

- 바인딩 소스와 바인딩 대상 양방향 모두 데이터 바인딩 한다.

즉. 바인딩 소스 값이 변경되어도 바인딩 대상 값이 변경되며, 바인딩 대상 값이 변경되어도 바인딩 소스 값이 변경된다.

OneWayToSoruce 방식

- OneWay방식 반대. 즉, 바인딩 소스와 바인딩 대상의 방향이 반대.

OneTime방식

- 최초 바인딩 소스 값이 바인딩 대상 속성 값을 초기화 하지만 그 이후에는 어떤 변환도 바인딩 대상,

  바인딩 소스 모두에 반영되지 않는 방식

 

데이터 바인딩을 이해하게 되었다면, 아래의 페이지로 넘어가서 실습을 진행해 보세요.

https://clear-sky-sun.tistory.com/4

728x90
728x90

1. 구성

랜덤 버튼을 통하여 0~9까지 총 10개의 숫자를 버튼 누를때 마다 랜덤으로 출력되며,

리셋 버튼을 눌러 초기화를 시켜줍니다.

 

2. 진행

MainPage.xaml

<Page
    x:Class="App4.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App4"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid Margin="0,0,2,0">
        <Button Name="btnRandom" Content="Random Numbers" 
      Margin="290,430,0,0" RenderTransformOrigin="0.437,0.002" 
      Click="btnRand_Click" VerticalAlignment="Top"/>
        <ListBox Name="lstRand" Height="295" Margin="290,104,405,0" 
      VerticalAlignment="Top"/>
        <Button Content="Reset" Margin="511,430,0,0" VerticalAlignment="Top" 
      Height="32" RenderTransformOrigin="0.522,-0.162" Click="btnReset_Click"/>

    </Grid>
</Page>

 

MainPage.xaml.cs

public sealed partial class MainPage : Page
    {
        Random r = new Random();
        int[] check = new int[10]; //new int가 아닌 int만 작성시, "잘 못된 식의 항'int'입니다" 메세지뜬다. 그 이유는 new  동적으로 할당 된 메모리를 담당.
                                   //new 오른쪽에 선언 된 변수에 반환된다. 숫자 10개를 입력 받는다. 입력 받는 값은 동적 값이다.(프로그램 실행 할 때마다 변경되는 값)
                                   //정수 배열 생성, 초기값 0 할당됨, 랜던값 : 10개
        List<int> lstRandom = new List<int>(); //List :: 배열과 동일한 역활을 한다. List<자료형> 변수명 형태로 선언하고, 객체라서 new 연산자 작성 필수!! 

        public MainPage()
        {
            this.InitializeComponent();
        }

        private void btnRand_Click(object sender, RoutedEventArgs e)
        {
            for (int i = 0; i < 10; i++)
            {
                int v = r.Next(10); //Next(10) :: 문자 또는 문자열을 공백을 기준으로 한단어 또는 한문자씩 입력 받는다. //NextLine(10) :: 문자 또는 문장 한라인 전체를 입력 받는다.
                while (RndCheck(v) == false) //While 문은 false면 반복한다. //생성된 랜덤값은 RndCheck() 메서드로 보내서 처음 나온 값인지 체크하여 처음 나온 값이라면 lstRandom에 추가한다.
                    v = r.Next(10);
                lstRandom.Add(v); //Add(i) :: Add는 추가적으로 선택 해야 할 때 사용 합니다. 추가로 i요소를 선택 합니다.
            }

            foreach (var i in lstRandom) //foreacg는 https://blockdmask.tistory.com/313 설명 참고
                lstRand.Items.Add(i); //Items :: lstRand의 항목을 가져옵니다.

            btnRandom.IsEnabled = false; //IsEnabled :: 이 요소를 사용자 인터페이스에서 사용 할 수 있는지 여부를 나타내는 값을 가져오거나 설정 합니다.                                         
        }

        private bool RndCheck(int v) //check[v]의 값이 0이면  true를, 1이면 false를 리턴한다.
        {
            if (check[v] == 0)
            {
                check[v] = 1;
                return true;
            }
            else
                return false;
        }

        private void btnReset_Click(object sender, RoutedEventArgs e) //Reset 버튼이 클릭되었을 때 실행되는 이벤트 처리 메서드, 리스트박스를 지워주고,  check[] 배열과 리스트  lstRandom을 초기화한다다.
        {
            lstRand.Items.Clear(); //Clear() :: 요소 모두 제거 // Itme을 통하여 lstRand의 항목을 가지고와 Clear()으로 지운다.
            for (int i = 0; i < 10; i++)
                check[i] = 0;
            lstRandom.Clear();
            btnRandom.IsEnabled = true;
        }
    }

 

3. 결과

728x90

+ Recent posts