728x90
반응형

App 에서 위치 정보를 사용하는 경우 사용자가 위치 허용을 하지 않았을때


Android 는 앱을 재시작하면 권한을 묻는 화면이 떠 권한을 허용할수 있습니다.

 

하지만 iOS 는 앱을 재시작하더라도 권한을 묻는화면이 뜨지않고

셋팅창에서 직접 위치 허용을 해줘야합니다.

 

이때 코드단에서 셋팅창으로 이동하고 싶을때 예시입니다.

 

DependencyService 를 이용하여

 

아래 처럼 코딩하면 앱 셋팅창으로 이동할 수 있습니다.

 

 

 

            if (!CLLocationManager.LocationServicesEnabled)

            {

                if (UIDevice.CurrentDevice.CheckSystemVersion(10, 0))

                {

                    UIApplication.SharedApplication.OpenUrl(new NSUrl("App-Prefs:root=General"));

                }

                else

                {

                    UIApplication.SharedApplication.OpenUrl(new NSUrl("prefs:root=General"));

                }

            }

            else if (CLLocationManager.Status == CLAuthorizationStatus.Denied ||

                     CLLocationManager.Status == CLAuthorizationStatus.NotDetermined ||

                     CLLocationManager.Status == CLAuthorizationStatus.Restricted)

            {

                UIApplication.SharedApplication.OpenUrl(new NSUrl(UIApplication.OpenSettingsUrlString));

            }

 

 

 

 

 

728x90
반응형
728x90
반응형

http://www.rw-designer.com/cursor-library

 

Open Cursor Library - 122631 cursors

 

www.rw-designer.com

 

www.deviantart.com/topic/customization

 

DeviantArt - Discover The Largest Online Art Gallery and Community

DeviantArt is the world's largest online social community for artists and art enthusiasts, allowing people to connect through the creation and sharing of art.

www.deviantart.com

 

728x90
반응형
728x90
반응형

Gradient 를 파랑(0) 초록(0.5) 노랑(1) 으로 표현을 한 경우

% 에 따른 색상을 구할때 사용한다.

 

        #region GetColorByOffset(double)

        /// <summary>

        /// Gradient 색의 offset 값을 구합니다.

        /// </summary>

        /// <param name="offset"></param>

        /// <returns></returns>

        private Color GetColorByOffset(double offset)

        {

            GradientStopCollection collection = new GradientStopCollection(3);

            collection.Add(new GradientStop(Colors.Blue, 0));

            collection.Add(new GradientStop(Colors.Green, 0.5));

            collection.Add(new GradientStop(Colors.Yellow, 1));

 

            GradientStop[] stops = collection.OrderBy(x => x.Offset).ToArray();

            if (offset <= 0) return stops[0].Color;

            if (offset >= 1) return stops[stops.Length - 1].Color;

            GradientStop left = stops[0], right = null;

            foreach (GradientStop stop in stops)

            {

                if (stop.Offset >= offset)

                {

                    right = stop;

                    break;

                }

                left = stop;

            }

 

            //Debug.Assert(right != null);

            offset = Math.Round((offset - left.Offset) / (right.Offset - left.Offset), 2);

            byte a = (byte)((right.Color.A - left.Color.A) * offset + left.Color.A);

            byte r = (byte)((right.Color.R - left.Color.R) * offset + left.Color.R);

            byte g = (byte)((right.Color.G - left.Color.G) * offset + left.Color.G);

            byte b = (byte)((right.Color.B - left.Color.B) * offset + left.Color.B);

            return Color.FromArgb(a, r, g, b);

        }

        #endregion

 

728x90
반응형
728x90
반응형

전면/배너 광고를 넣는 예제 소스입니다.

 

Android 는 AndroidManifest.xml 과 AdBannerRenderer 에

iOS 는 Info.plist, AdBannerRenderer 에

광고 관련 ID 를 수정해야합니다.

 

https://github.com/kei-soft/AdMobSample

 

728x90
반응형
728x90
반응형

using System;

using System.Threading;

using System.Threading.Tasks;

 

using Android.Content;

using Android.Webkit;

 

using AUOSMS.APP.Controls;

using AUOSMS.APP.Droid.Renderers;

 

using Xamarin.Forms;

using Xamarin.Forms.Platform.Android;

 

[assembly: ExportRenderer(typeof(WebViewer), typeof(WebViewRender))]

namespace AUOSMS.APP.Droid.Renderers

{

    public class WebViewRender : WebViewRenderer

    {

        public WebViewRender(Context context) : base(context)

        { }

 

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)

        {

            base.OnElementChanged(e);

 

            if (Control == null) return;

 

            // Cache Clear

            Control.ClearCache(true);

            Control.Settings.SetAppCacheEnabled(false);

            Control.Settings.CacheMode = Android.Webkit.CacheModes.NoCache;

 

            // JavaScript 허용

            Control.Settings.JavaScriptEnabled = true;

 

            // Cookie 허용

            CookieManager cookieManager = CookieManager.Instance;

            cookieManager.SetAcceptCookie(true);

            cookieManager.SetAcceptThirdPartyCookies(Control, true);

        }

    }

}

 

* 참고링크

https://stackoverflow.com/questions/42853636/put-cookie-on-a-webview-in-xamarin/42854428

 

* 참고지식 - Android 기준

mixedContentMode

혼합 컨텐츠 모드를 지정합니다. 즉, WebView를 사용하면 안전한 출처가 다른 출처의 콘텐츠를로드 할 수 있습니다.

never (기본값) : WebView는 보안 오리진이 안전하지 않은 오리진에서 컨텐츠를로드하도록 허용하지 않습니다.

always : WebView를 사용하면 보안 출처가 다른 출처에서 콘텐츠를로드 할 수 있습니다 (해당 출처가 안전하지 않은 경우에도).

compatibility : WebView는 혼합 컨텐츠와 관련하여 최신 웹 브라우저의 접근 방식과 호환되도록 시도합니다.

 

 

thirdPartyCookiesEnabled

WebView 에서 타사 쿠키를 활성화하는 부울 값입니다. Android Kitkat 이상 및 iOS에서 타사 쿠키가 기본적으로 활성화 된 경우에만 Android Lollipop 이상에서 사용됩니다.

기본값은 true 입니다.

 

 

 

728x90
반응형
728x90
반응형
/// <summary>
/// Random Color
/// </summary>
/// <returns></returns>
private Brush RandomBrush()
{
    Brush result = Brushes.Transparent;

    Random random = new Random();

    Type brushesType = typeof(Brushes);

    PropertyInfo[] properties = brushesType.GetProperties();

    int randomValue = random.Next(properties.Length);
    result = (Brush)properties[randomValue].GetValue(null, null);

    return result;
}

 

728x90
반응형
728x90
반응형
고프로 히어로8 액션캠 SPJB1 블랙 + 듀얼배터리 충전기 킷 탐사 황사마스크 KF80, 일반 대형, 개별포장, 20개입 곰곰 사과 배 혼합 선물세트 골드, 5.5kg, 1개 디붐 디투 블루투스 스피커, 단일상품, 포레스트그린 바디굿 3단밴드 손목보호대, 1개

폴더의 파일을 읽어서 내용중에 찾고자하는 내용이 있다면 목록에 표시되며 목록을 더블클릭하면

화면에 파일이 선택되어 표시됩니다.


개발언어 : C#

[사용방법 - 간단]

1. 내용을 찾을 폴더를 찾거나 경로를 입력합니다.

2. 검색할 내용을 입력 후 Enter 하거나 Search  버튼을 클릭합니다.


목록을 더블클릭하면 아래 처럼 화면에 표시됩니다.


다운로드

https://kei-soft.bitbucket.io/XmlSearch.exe



728x90
반응형
728x90
반응형
고프로 히어로8 액션캠 SPJB1 블랙 + 듀얼배터리 충전기 킷 탐사 황사마스크 KF80, 일반 대형, 개별포장, 20개입 디붐 타임박스 스마트 LED 올인원 블루투스스피커, TIMEBOX, 심플블랙 디붐 디투 블루투스 스피커, 단일상품, 포레스트그린 바디굿 3단밴드 손목보호대, 1개

        // EUC-KR

        private string EuckrEncoding(string data)

        {

            System.Text.Encoding euckr = System.Text.Encoding.GetEncoding(51949);

            byte[] euckrBytes = euckr.GetBytes(data);


            string urlEncodingText = "";

            foreach (byte b in euckrBytes)

            {

                string addText = Convert.ToString(b, 16);

                urlEncodingText = urlEncodingText + "%" + addText;

            }

            return Convert.ToString(urlEncodingText);

        }


        // UTF-8

        private string Utf8Encoding(string data)

        {

            System.Text.Encoding utf8 = System.Text.Encoding.UTF8;

            byte[] utf8Bytes = utf8.GetBytes(data);


            string urlEncodingText = "";

            foreach (byte b in utf8Bytes)

            {

                string addText = Convert.ToString(b, 16);

                urlEncodingText = urlEncodingText + "%" + addText;

            }

            return Convert.ToString(urlEncodingText);

        }


728x90
반응형
728x90
반응형

 

Web 파이러터 처리시 한글을 % 가 포함된 문자열로 인코딩하여 보내할 경우가 있는데

이를 처리하기위해선 System.Web 의 HttpUtility 를 사용해야한다.

참조 추가에서 어셈블리의 System.Web 를 체크하면 된다.

 

 

사용방법은 아래와 같다.

 

 

// 인코딩하는 방법

string encodeName = HttpUtility.UrlEncode("테스트", Encoding.UTF8);

 

// 인코딩한 내용을 다시 디코딩하는 방법

string originalName = HttpUtility.UrlDecode(encodeName, Encoding.UTF8);

 

 

(encodeName  의 값은 "%ed%85%8c%ec%8a%a4%ed%8a%b8")

 

 

 

728x90
반응형
728x90
반응형

UpdateSourceTrigger 속성은 바인딩 소스 업데이트 타이밍을 결정하는 값을 가져오거나 설정할때 사용되는 속성입니다.

 

Default

Text속성의 기본값은 LostFocus이지만, 대부분의 종속성 속성의 기본값은 PropertyChanged입니다.

 

PropertyChanged

바인딩 대상 속성이 변경될 때마다 바인딩 소스를 즉시 업데이트합니다.

 

LostFocus

바인딩 대상 요소가 포커스를 잃을 때마다 바인딩 소스를 업데이트합니다.

 

Explicit

UpdateSource 메서드를 호출할 때만 바인딩 소스를 업데이트합니다.


예)

 BindingExpression bindingExpression = textBox.GetBindingExpression(TextBox.TextProperty);

 bindingExpression.UpdateSource();


 

 

* 간단히 말하면 커서가 벗어난 경우(LostFocus) 속성변경 처리를 할것이냐 아니면 실시간으로(PropertyChanged) 반영할것이냐라고 보면 될것같습니다.

 

아래는 간단한 예시입니다.

 

MainWindow.xaml

<Window x:Class="UpdateSourceTriggerTest.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"

        mc:Ignorable="d"

        Title="MainWindow" Height="190" Width="394.666">

    <Grid>

        <StackPanel>

            <Label Content="UpdateSourceTrigger=PropertyChanged"/>

            <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>

            

            <Rectangle StrokeThickness="1" Fill="#465168" Height="1" />

            <Label Content=" UpdateSourceTrigger=Default"/>

            <TextBox Text="{Binding Name, UpdateSourceTrigger=Default}"/>

 

            <Rectangle StrokeThickness="1" Fill="#465168" Height="1" />

            <Label Content=" Value"/>

            <Label Content="{Binding Name}"/>

        </StackPanel>

    </Grid>

</Window>

 

 

MainWindow.xaml.cs

using System.Windows;

 

namespace UpdateSourceTriggerTest

{

    /// <summary>

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

    /// </summary>

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

 

            this.DataContext = new TestData() { Name = "TEST", Order = 1 };

        }

 

        public class TestData

        {

            public string Name { get; set; }

            public int Order { get; set; }

        }

    }

}

 

 


 

예시를 보면

PropertyChanged 인 경우는 실시간으로 변경사항이 반영되지만

Default 인 경우는 커서를 벗어난 경우 변경사항이 반영됩니다.

상황에 따라 맞는걸 쓰면 되겠습니다.

 

 

728x90
반응형

+ Recent posts