datacontext 의 특정 Command 를 실행하는 메서드로 Parameter 를 인자로 전달 할수 있습니다.


using System.Reflection;

using System.Windows.Input;


namespace WpfApp

{

    class TestClass

    {


        /// <summary>

        /// DataContext 의 특정 Command 를 파라미터와 함께 실행합니다.

        /// </summary>

        /// <typeparam name="T">파라미터 타입입니다.</typeparam>

        /// <param name="dataContext">DataContext 입니다.</param>

        /// <param name="command">Command 명입니다.</param>

        /// <param name="parameter">파라미터입니다.</param>

        public static void Execute<T>(object dataContext, string command, T parameter)

        {

            if (dataContext == null)

            {

                return;

            }


            if (string.IsNullOrWhiteSpace(command) == true)

            {

                return;

            }


            // Command 명으로 찾습니다.

            PropertyInfo pi = dataContext.GetType().GetProperty(command);

            if (pi == null)

            {

                return;

            }


            // Command 로 변환합니다.

            ICommand ic = pi.GetValue(dataContext, null) as ICommand;

            if (ic == null)

            {

                return;

            }


            // Command 를 호출합니다.

            ic.Execute(parameter);

        }

    }

}




        /// <summary>
        /// 이미지를 Crop 한 결과를 반환합니다.
        /// </summary>
        /// <param name="imageSource">원본이미지입니다.</param>
        /// <param name="x">잘라낼 x 축 값입니다.</param>
        /// <param name="y">잘라낼 y 축 값입니다.</param>
        /// <param name="width">잘라낼 너비값입니다.</param>
        /// <param name="height">잘라낼 높이값입니다.</param>
        /// <returns>잘라낸 이미지입니다.</returns>
        public static ImageSource CropImage(ImageSource imageSource, double x, double y, double width, double height)
        {
            return new CroppedBitmap((BitmapSource)imageSource, new Int32Rect((int)x, (int)y, (int)width, (int)height));
        }


Dictionary<string, string> myDictionary = new Dictionary<string, string>();
myDictionary.Add("a", "x");
myDictionary.Add("b", "y");
int i = Array.IndexOf(myDictionary.Keys.ToArray(), "a");
int j = Array.IndexOf(myDictionary.Values.ToArray(), "y");


로또 앱을 만들면서 https://www.geniecontents.com 이곳에서 데이터를 가져와서 보여줬는데

갑자기 서비스가 중단이 되었다;;;

그래서 직접 동행복권 사이트를 크롤링해서

로또번호와 로또 당첨점 정보를 가져오고 싶었다.


API 로 번호등 정보를 가져올수 있지만 원하는 정보가 모두 없어서 크롤링하여 가져오도록 했고

로또번호와 당첨금내역 그리고 1등 당첨정 정보를 수집했다.


아래는 로또넘버원 화면 캡쳐

  


크롤링 관련 소스는 junijuniya@naver.com 으로 문의 해주세요

Update 쿼리 시 아래와 같은 에러가 발생되었다.

System.Data.SqlClient.SqlException: 'The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.
Warning: Null value is eliminated by an aggregate or other SET operation.
The statement has been terminated.'

찾아보니 Select 시 SUM 등을 할때 null 인 항목이 있는 경우 에러가 도출된다고 하는데

SET ANSI_WARNINGS OFF

GO


위 명령을 통해 오류는 도출되지 않도록 할수 있다고한다.


하지만 내가 겪은건 희한하게 다른 컬럼을 처리하면 상관없는데

유독 한 컬럼만 문제가 있었다.

컬럼명이 예약어와 동일해서 문제가 생기는줄 알고 열심히 백틱, 더블쿼테이션, 대괄호 처리 를 했지만 오류가 계속 도출..;;


결론은 
해당 컬럼에 Trigger 가 걸려있었고 그 Trigger 에서 발생되는 에러였다.




iOS 에서 SafeArea 를 지정 하면

상단과 하단에 영역이 생기면서 그쪽에는 앱구동 화면이 표시되지 않는다

하지만 하단의 영역은 살려두고 싶을때가 있다. 

이때는 OnAppearing() 에 아래처럼 코딩하면 하단의 영역을 살려 

앱구동화면이 하단에도 문제 없이 표시된다.


protected override void OnAppearing()

{

    base.OnAppearing();

    var safeInsets = On<iOS>().SafeAreaInsets();

    safeInsets.Bottom = 0;

    Padding = safeInsets;

}



Command 에 인자로 두가지 항목을 던지고자 할때

이를 class 로 정의하여 CommandParameter 로 던질수 있다.

 

먼저 프로젝트에 Prism.Wpf Nuget Package 를 설치한다.

 

이제 Class 구조를 잡는다.

(string, object 로 구성)

[StringObject.cs]

namespace MultiValueConverterSample

{

    public class StringObject

    {

        /// <summary>

        /// 문자열 데이터입니다.

        /// </summary>

        public string StringData;

 

        /// <summary>

        /// 오브젝트 데이터입니다.

        /// </summary>

        public object ObjectData;

 

        /// <summary>

        /// 생성자입니다.

        /// </summary>

        /// <param name="stringData">문자열 데이터입니다.</param>

        /// <param name="objectData">오브젝트 데이터입니다.</param>

        public StringObject(string stringData, object objectData)

        {

            this.StringData = stringData;

            this.ObjectData = objectData;

        }

    }

}

 

 

IMultiValueConverter 를 정의한다.

(화면에서 처리된 두개의 인자를 가지고 위에서 만들 Class 구조로 변환해 리턴)

[StringObjectConverter.cs]

using System;

using System.Globalization;

using System.Windows.Data;

 

namespace MultiValueConverterSample

{

    public class StringObjectConverter : IMultiValueConverter

    {

        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)

        {

            return new StringObject(values[0].ToString(), values[1]);

        }

 

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)

        {

            throw new NotImplementedException();

        }

    }

}

 

 

화면에 아래 처럼 구성한다.

(조회 버튼을 클릭하면 StringObjectCommand 를 실행해

입력한 값을 string 으로 버튼 객체를 object 로 하여 CommandParameter 로 사용한다.)

[MainWindow.xaml]

<Window x:Class="MultiValueConverterSample.MainWindow"

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

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

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

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

        xmlns:local="clr-namespace:MultiValueConverterSample"

        mc:Ignorable="d"

        Title="MainWindow" Height="450" Width="800">

    <Window.Resources>

        <local:StringObjectConverter x:Key="StringObjectConverter" />

    </Window.Resources>

    <Grid>

        <StackPanel>

            <TextBox Name="contentTextBlock" Width="100" Height="30" Margin="10"/>

            <Button Name="searchButton" Content="조회" Margin="10" Height="30" Width="100" Command="{Binding StringObjectCommand}">

                <Button.CommandParameter>

                    <MultiBinding Converter="{StaticResource StringObjectConverter}">

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

                        <Binding ElementName="searchButton" />

                    </MultiBinding>

                </Button.CommandParameter>

            </Button>

        </StackPanel>

    </Grid>

</Window>

 

 

코드비하인드 단에서는 아래 처럼 처리한다.

(반드시 this.DataContext = this; 을 해야 Command 가 처리된다.)

[MainWindow.xaml.cs]

using Prism.Commands;

 

using System.Windows;

using System.Windows.Input;

 

namespace MultiValueConverterSample

{

    /// <summary>

    /// MainWindow.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class MainWindow : Window

    {

        #region StringObjectCommand

 

        /// <summary>

        /// StringObjectCommand

        /// </summary>

        public ICommand StringObjectCommand

        {

            get

            {

                if (stringObjectCommand == null)

                {

                    stringObjectCommand = new DelegateCommand<StringObject>((stringObject) =>

                    {

                        string stringData = stringObject.StringData;

                        object objectData = stringObject.ObjectData;

                    });

                }

                return stringObjectCommand;

            }

        }

        private DelegateCommand<StringObject> stringObjectCommand;

 

        #endregion

 

        public MainWindow()

        {

            InitializeComponent();

 

            this.DataContext = this;

        }

    }

}

 

 

 

조회 버튼을 누르게 되면 Command 에서 아래 처럼 해당 항목이 넘어온것을 확인할 수 있다.

 

 

 


Rg.Plugins.Popup 을 이용해서 팝업을 호출한 경우 Back  버튼이나 팝업을 벗어난 화면을 터치한 경우

팝업이 닫히게 되는데 이를 막기 위해서 코드단에 아래와 같은 코드를 넣으면 된다.


CloseWhenBackgroundIsClicked = false;

ContextMenu 의 Item 을 선택한 경우 ContextMenu 가 닫히는데

만약 체크 박스가 있는 경우 이를 유지하고 싶을 때가 있다.

이때 MenuItem 의 StaysOpenOnClick 을 true 로 주게 되면 ContextMenu 가 닫히지 않고

클릭 이벤트가 수행된다.


                <ContextMenu>

                    <MenuItem Header="첫번째" IsCheckable="True" StaysOpenOnClick="True"/>

                </ContextMenu>



Shell.Current.GoToAsync("..");

페이지를 지정하지 않고 바로 이전 페이지로 가고 싶을때 사용합니다.


+ Recent posts