GridView, ListView에 있는 SelectedItems 프로퍼티는 바인딩이 되지 않는다. 그래서, 바인딩 가능한 Behavior를 만들어 보았다.

Windows 8.1 Moden App에서 테스트를 했는데, Windwos 8에서도 가능하리라 생각된다.

 

참고 포스트

Behaviors in Windows 8.1 Store Apps

http://www.julmar.com/blog/programming/behaviors-in-windows-8-1-store-apps/

 

1. Behavior(08-05-2015 update)

 

public class SelectedItemsBehavior : DependencyObject, IBehavior

{

/// <summary>

/// 비헤이비어에 붙어있는 프로퍼티

/// </summary>

public static readonly DependencyProperty SelectedItemsProperty =

DependencyProperty.Register("SelectedItems", typeof (object), typeof (SelectedItemsBehavior),

new PropertyMetadata(null, OnSelectedItemsChanged));

/// <summary>

/// 이벤트 중복 방지

/// </summary>

private readonly object _isLock = new object();

/// <summary>

/// IsBusy

/// </summary>

private bool _isBusy;

/// <summary>

/// 뷰 모델의 프로퍼티 - 반드시 object로 만든다. 다른형은 프로퍼티 추가가 않된다.

/// </summary>

public object SelectedItems

{

get { return GetValue(SelectedItemsProperty); }

set { SetValue(SelectedItemsProperty, value); }

}

/// <summary>

/// 연결되어있는 오브젝트

/// </summary>

public DependencyObject AssociatedObject { get; private set; }

/// <summary>

/// Listview에 연결 될때 실행되는 메소드

/// </summary>

/// <param name="associatedObject"></param>

public void Attach(DependencyObject associatedObject)

{

if ((associatedObject != AssociatedObject) && !DesignMode.DesignModeEnabled)

{

if (AssociatedObject != null)

throw new InvalidOperationException("Cannot attach behavior multiple times.");

AssociatedObject = associatedObject;

var control = AssociatedObject as ListViewBase;

if (control == null)

{

throw new InvalidOperationException("Cannot attach behavior you must have ListViewBase.");

}

//SelectedItems가 Runtime Object임

control.SelectionChanged += control_SelectionChanged;

}

}

/// <summary>

/// ListView 연결 해제될때 실행되는 메소드

/// </summary>

public void Detach()

{

if (SelectedItems != null)

{

((INotifyCollectionChanged) SelectedItems).CollectionChanged -= ViewModelToControl_CollectionChanged;

}

if (AssociatedObject != null)

{

((ListViewBase) AssociatedObject).SelectionChanged -= control_SelectionChanged;

}

AssociatedObject = null;

}

/// <summary>

/// 컨트롤에 변경 사항을 뷰모델로 반영

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void control_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

lock (_isLock)

{

if (_isBusy) return;

_isBusy = true;

}

var control = AssociatedObject as ListViewBase;

if (control == null) return;

var list = SelectedItems as IList;

if (list == null) return;

if (e.AddedItems != null && e.AddedItems.Any())

{

foreach (var addedItem in e.AddedItems)

{

var existIndex = list.IndexOf(addedItem);

if (existIndex == -1)

list.Add(addedItem);

}

}

if (e.RemovedItems != null && e.RemovedItems.Any())

{

foreach (var removedItem in e.RemovedItems)

{

var existIndex = list.IndexOf(removedItem);

if (existIndex > -1)

list.Remove(removedItem);

}

}

_isBusy = false;

}

/// <summary>

/// 비헤이비어 프로퍼티 체인지 이벤트

/// </summary>

private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

{

var source = (SelectedItemsBehavior) d;

//이전 프로퍼티에 붙어있던 이벤트 제거

var oldCollection = e.OldValue as INotifyCollectionChanged;

if (oldCollection != null)

{

oldCollection.CollectionChanged -= source.ViewModelToControl_CollectionChanged;

}

//새 프로퍼티에 이벤트 연결

var newCollection = e.NewValue as INotifyCollectionChanged;

if (newCollection != null)

{

newCollection.CollectionChanged += source.ViewModelToControl_CollectionChanged;

}

}

/// <summary>

/// 뷰모델의 프로퍼티에서 발생한 이벤트를 이용해서 컨트롤에 작업

/// </summary>

private void ViewModelToControl_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)

{

lock (_isLock)

{

if (_isBusy) return;

_isBusy = true;

}

var control = AssociatedObject as ListViewBase;

//Reset처리

if (e.Action == NotifyCollectionChangedAction.Reset)

{

if (control == null) return;

control.SelectedItems.Clear();

}

//삭제된 아이템 처리

if (e.OldItems != null)

{

foreach (var item in e.OldItems)

{

if (control != null && control.SelectedItems.Contains(item))

{

control.SelectedItems.Remove(item);

}

}

}

//추가된 아이템 처리

if (e.NewItems != null)

{

try

{

foreach (var item in e.NewItems)

{

if (control != null && control.SelectedItems.Contains(item) == false)

{

control.SelectedItems.Add(item);

}

}

}

catch (OutOfMemoryException ome)

{

EtcHelper.Instance.MsgBox(ome.Message);

}

catch (Exception ex)

{

Debug.Assert(false, ex.Message);

}

}

_isBusy = false;

}

}

 

2. XAML

 

            <ListView x:Name="listView" Grid.Row="1" ItemsPanel="{StaticResource HItemsPanelTemplate}" SelectionMode="Multiple"
       ItemsSource="{Binding SelectedImage.ItemImages}" >
             <Interactivity:Interaction.Behaviors>
              <Behaviors:SelectedItemsBehavior SelectedItems="{Binding SelectedItemImages}"/>
             </Interactivity:Interaction.Behaviors>

    <ListView.ItemTemplate>
     <DataTemplate>
      <Grid>
       <Image Source="{Binding WorkedImage}"/>
       <StackPanel VerticalAlignment="Bottom" Background="{StaticResource DefaultImageTextBackgroundBrush}" >
        <TextBlock Style="{StaticResource DetailTitleStyle12}" Margin="5,10,0,5">
            <Run Text="{Binding FileName}"/>
            <Run Text="{Binding ExtName}"/>
        </TextBlock>
       </StackPanel>
      </Grid>
     </DataTemplate>
    </ListView.ItemTemplate>
   </ListView>


 

3. ViewModel

 

        private ICollection<FileInfoM> _selectedItemImages;
        /// <summary>
        /// 선택된 아이템들
        /// </summary>
        public ICollection<FileInfoM> SelectedItemImages
        {
            get { return _selectedItemImages; }
            set { _selectedItemImages = value; OnPropertyChanged(); }
        }

 

...

생성자에서 인스턴스

SelectedItemImages = new ObservableCollection<FileInfoM>();

...

 

        private DelegateCommand _selectAllCommand;
        /// <summary>
        /// Select All Command
        /// </summary>
        public DelegateCommand SelectAllCommand
        {
            get
            {
                return _selectAllCommand = _selectAllCommand ?? new DelegateCommand(
                args =>
                {
                    if (SelectedItemImages.Count != SelectedImage.ItemImages.Count)
                    {
                        foreach (var item in SelectedImage.ItemImages)
                        {
                            SelectedItemImages.Add(item);
                        }
                    }
                    else
                    {
                        foreach (var item in SelectedImage.ItemImages)
                        {
                            SelectedItemImages.Remove(item);
                        }
                    }
                });
            }
        }

 

4. 작업 화면

 

SelectAll 버튼을 클릭해서 하단의 2개 아이템 선택

 

전체 선택이 된 상태에서 다시 하번 누르면 선택 해제

 

5. 앱 개발이 마무리 단계라 소스를 올리지 못했는데, 나중에 요청이 있으면 간단한 셈플을 만들어서 올리도록 하겠다. 실버라이트용 Behavior는 약간 다르지만 기본적인 내용은 동일하니 참고해서 만들면 된다.

 

블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

앱 개발 후 수익 모델로 가장 쉽게 사용할 수 있는 것이 광고를 추가하는 방법이다.

이 포스트에서 간단하게 내가 사용하고 있는 광고 종류와 붙이는 방법에 대해서 간단히 설명하도록 하겠다.

 

1. AdDuplex

http://adduplex.com/

기본 컨셉은 내 앱에서 다른 앱 광고를 해주고, 다른 앱에서 내 앱을 광고해주는 앱 광고를 서로 나누면서, 다운로드 수를 올리기 위해 사용된다.

 

가입 후 새로운 앱을 등록하면 아래와 같은 화면이 나온다.

 

 

위에서 App ID가 앱에서 입력해야하는 코드이다. 보안상 코드값은 삭제했다.

 

단계별로 어떻게 해야하는지 정리가 되어있기 때문에 그대로 따라하면 된다.

1. Add app title : 앱 제목과 기본 광고 문구를 입력한다.

2. Create a banner : 기본 광고 문구가 표시되면서 각 크기별로 내용을 수정할 수 있다. 기본은 택스트만 지원하며, 이미지는 별도록 사이즈별로 제작해서 넣으면 된다.

3. Add AdDuplex SDK : SDK를 앱에 추가하는 방법에 대해서 설명이 나온다.

 

 

각 사이즈별로 내가 입력한 광고 문구가 미리 표시가 된다. 내용이 너무 많아서 여러줄이 되어서 크기를 벗어나면 각 사이즈 별로 문구를 수정해서 내용을 정리할 수 있다.

 

2. 솔루션에 AdDuplex SDK 추가하기

솔루션에서 마우스 오른쪽 버튼을 클릭해서 Managed Nuget Packages를 선택 -> Online -> adduplex 검색어 입력 -> AdDuplex SDK for Windows8 (Xaml edition)을 선택한다.

 

 

 

이제 프로젝트에서 사용할 준비가 완료된 것이다.

 

3. 화면에 광고 표시하기

xaml에 namaspace추가

 

xmlns:ad="using:AdDuplex.Controls"

 

Hub컨트롤에 하나의 HubSection에 AdControl추가

 

   <HubSection>
    <DataTemplate>
     <Grid>
      <ad:AdControl Size="160x600" AppId="[위에서 발급받은 App ID입력]" Margin="0,-15,0,0"/>
     </Grid>
    </DataTemplate>
   </HubSection>

 

AdControl에서 중요한 프로퍼티는 2가지이다. Size와 AppId 이 두가지를 꼭 선택해야 광고가 제대로 표시 된다.

(HubSection이라 Margin을 -15를 주어야 하단이 짤리지 않음, Margin은 화면의 구성에 따라 다름)

 

 

 

개발 도중에도 광고가 계속 나오는 걸 알 수 있다.

 

4. 마지막으로 가장 중요한 Activate

이렇게 해서 개발을 완료 후 스토어에 정식으로 등록이 되면, 앱이 등록된 주소를 AdDuplex사이트에서 입력해 주어야 한다. 입력하고 몇일 후에 정식으로 Activate가 되면, 그 때부터 내 앱에 대한 광고가 다른 앱에 표시가 된다.

 

아래는 현재 Activate가 되어 있는 앱이다. 화면에서와 같이 Running 표시가 되어야 한다.

 

 

5. AdDuplex는

직접적인 수익이 발생하는 것이 아니라 내 앱을 광고하기 위해 사용한다. 그래서, 직접적인 수익이 발생하는  Microsoft Advertising SDK for Windows 8을 메인 광고로 넣어야 한다. 이 부분에 대해서는 다음에 포스팅 하도록 하겠다.

 

 

블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

참고

Instantiate a System.Type from a type definition string

http://stackoverflow.com/questions/13842173/instantiate-a-system-type-from-a-type-definition-string

 

앱을 개발하기 위해 CrossPlatform이라는 라이브러리 프로젝트를 사용하는데, 이런 경우 스트링으로 인스턴스를 시켜야 하는 경우가 많이 있다. 일반적으로는

 

Type t = Type.GetType(typeName, false);

object result = null;

if(t != null) result = Activator.CreateInstance(t);

 

위의 문장으로 처리가 되지만, 이 문장이 동작하기 위한 선결 조건이 사용하는 프로젝트 내부에 해당 Type이 있어야 한다는 것이다. 만약 클래스라이브러리에서 위의 문장을 실행하면 Type을 찾을 수 없게 된다.

그런 경우 아래와 같이 하면 Type을 찾고 인스턴스 시킬 수 있다.

 

* contentTypeName은 네임스페이스까지 포함한 Type의 FullName이다.

 

                Popup popup = new Popup();

                var contentType = Application.Current.GetType().GetTypeInfo().Assembly.GetType(contentTypeName);

                if (contentType != null)
                {
                    var content = Activator.CreateInstance(contentType);
                    if (content != null && content is UIElement)
                    {
                        popup.Child = (UIElement)content;
                    }
                }

위와 같이 하면, 실행 중인 앱의 어셈블리에서 Type을 찾아서 반환한다.

 

블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

Windows 8 vs Windows 8.1 API Compare

http://firstfloorsoftware.com/Media/DiffLists/Windows%208-vs-Windows%208.1.html

 

매우 정리가 잘되어 있음

 

 

WinRT and Windows Phone 8 Code-Sharing Pitfalls

http://blog.markedup.com/2013/07/winrt-windows-phone-8-code-sharing-pitfalls/

윈도우 폰api와 윈도우rt api와의 차이점에 대한 설명

 

 

Maximize code reuse between Windows Phone 8 and Windows 8

http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj681693(v=vs.105).aspx

 

 

PixPresenter

http://code.msdn.microsoft.com/wpapps/PixPresenter-Code-sharing-39ed631f

윈도우 8과 윈도우 폰 8을 동시에 사용하는 앱 셈플

 

블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

Windows Live Connect Manage

 

내 응용 프로그램

https://account.live.com/developers/applications/index

 

접속하면 LIve connect 서비스 사용 목록을 조회 가능

 

 

2. Windows Store App(Modern App)이 아닌 경우에는 여기서 응용 프로그램 만들기를 선택 한 후 진행 한다.

 

3. Windows Store App은 데시보드에서 진행한다.

 

https://appdev.microsoft.com/StorePortals/ko-KR/Home/Index

데시 보드에 접속해서 Live Connect 서비스를 등록할 앱을 선택한다.

 

 

Live 서비스 사이트 클릭

 

 첫화면

 

 확인

 

혹시라도 새로운 클라이언트 암호를 만들어야 할 필요가 있으면 이곳에서 처리한다. 

 

 

빈칸에 알맞은 내용을 입력한 후 저장하면

 

LIve connect 서비스 사용 목록에 추가 된다.

이후에는 Live SDK 사용 가능하다.

 

 

블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

언어별 사용 언어 코드 목록

Choosing your languages

http://msdn.microsoft.com/en-us/library/windows/apps/jj657969.aspx

 

언어 코드별 국가 목록

http://download.ni.com/contrib/epd/12BDC5D7CBB15E42E0440003BA230ECF/Locale_Web.txt

 

English

Australia, Brazil, Canada, Hong Kong SAR, India, Indonesia, Ireland, Kazakhstan, Malaysia

Malta, New Zealand, Pakistan, Philippines, Singapore, South Africa, trinidad and Tobago

United Kingdom, United States, Vietam

 

'Windows 8&8.1 > Sample&Tip 8.1' 카테고리의 다른 글

Windows 8.1 tips  (2) 2013.12.06
Windows Live Connect Manage  (0) 2013.12.06
Windows Store languages country list  (0) 2013.11.26
InvokeActionCommandEx  (0) 2013.11.21
Behaviors SDK  (0) 2013.11.20
adduplex event  (0) 2013.10.04
블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

Behavior SDK를 이용해서 작업을 하다보니 ItemClick 이벤트에 대한 처리를 할 수 없다는 걸 알았다.

그래서 InvokeActionCommandEx라는 IAction 클래스를 만들어 보았다.

 

InvokeActionCommand를 CommandParameter를 사용하지 않으면 기본적으로 이벤트 아규먼트를 반환한다.

즉, 아래의 내용은 참고로만 사용하도록 한다.

 

    public class InvokeActionCommandEx : DependencyObject, Microsoft.Xaml.Interactivity.IAction
    {
        #region Static Fields

 

        /// <summary>
        /// Defines the CommandParameter dependency property, of type <see cref="object"/>.
        /// </summary>
        public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register(
            "CommandParameter",
            typeof(object),
            typeof(InvokeActionCommandEx),
            new PropertyMetadata(null));

 

        /// <summary>
        /// Defines the Command dependency property, of type <see cref="ICommand"/>.
        /// </summary>
        public static readonly DependencyProperty CommandProperty = DependencyProperty.Register(
            "Command",
            typeof(ICommand),
            typeof(InvokeActionCommandEx),
            new PropertyMetadata(null));

 

        /// <summary>
        /// Defines the Command dependency property, of type <see cref="PassEventArgsToCommand"/>.
        /// </summary>
        public static readonly DependencyProperty PassEventArgsToCommandProperty = DependencyProperty.Register(
            "PassEventArgsToCommand",
            typeof(bool),
            typeof(InvokeActionCommandEx),
            new PropertyMetadata(false));

 

        #endregion

 

        #region Public Properties

        /// <summary>
        /// Gets or sets the command to be invoked.
        /// </summary>
        public ICommand Command
        {
            get
            {
                return (ICommand)this.GetValue(CommandProperty);
            }

            set
            {
                this.SetValue(CommandProperty, value);
            }
        }

        /// <summary>
        /// Gets or sets the command parameter to pass to the <see cref="ICommand"/> upon invocation.
        /// </summary>
        /// <remarks>
        /// This takes precedence over the <see cref="PassEventArgsToCommand"/> property - if <see cref="CommandParameter"/>
        /// is specified, then <see cref="PassEventArgsToCommand"/> is ignored.
        /// </remarks>
        public object CommandParameter
        {
            get
            {
                return this.GetValue(CommandParameterProperty);
            }

            set
            {
                this.SetValue(CommandParameterProperty, value);
            }
        }

        /// <summary>
        /// Gets or sets a value indicating whether or not the event arguments associated to the raised
        /// event should be passed to the command.
        /// </summary>
        public bool PassEventArgsToCommand
        {
            get
            {
                return (bool)this.GetValue(PassEventArgsToCommandProperty);
            }

            set
            {
                this.SetValue(PassEventArgsToCommandProperty, value);
            }
        }
        #endregion

 

        public object Execute(object sender, object parameter)
        {
            FrameworkElement element = sender as FrameworkElement;
    
            if (element != null && Command != null && Command.CanExecute(CommandParameter))
            {
                Command.Execute(CommandParameter == null && PassEventArgsToCommand == true ? parameter : this.CommandParameter);
            }
    
          return null;
        }

    }

 

 

XAML에서 사용

 

    xmlns:t="using:Microsoft.Xaml.Interactivity"
    xmlns:i="using:KTour.Behaviors"        //본인이 만든위치의 네임스페이스를 사용하면 된다.

 

                    <ListView Margin="0,0,0,10" Grid.Column="1" ItemsSource="{Binding SiGunGu}"
                              ItemTemplate="{StaticResource SiGunGuItemTemplate}"
                  IsItemClickEnabled="True" SelectedItem="{Binding SelectedSiGunGu, Mode=TwoWay}" Style="{StaticResource RemoveScrollViewerListViewStyle}"
                              BorderBrush="{StaticResource PageBackgroundBrush}" BorderThickness="1" ItemContainerStyle="{StaticResource ListViewItemContainerStyle}">
                        <t:Interaction.Behaviors>
                            <c:EventTriggerBehavior EventName="ItemClick">
                                <i:InvokeActionCommandEx Command="{Binding SiGunGuClickCommand, Mode=OneWay}" PassEventArgsToCommand="True"/>
                            </c:EventTriggerBehavior>
                        </t:Interaction.Behaviors>
                    </ListView>

 

ListView, GridView에서 ItemClick이벤트를 사용하는 경우 위와 같이 사용한다.

 

'Windows 8&8.1 > Sample&Tip 8.1' 카테고리의 다른 글

Windows Live Connect Manage  (0) 2013.12.06
Windows Store languages country list  (0) 2013.11.26
InvokeActionCommandEx  (0) 2013.11.21
Behaviors SDK  (0) 2013.11.20
adduplex event  (0) 2013.10.04
BasicApp template by rghwang  (0) 2013.10.04
블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

Windows 8.0 store app에서 Nuget packages를 이용해서 사용하던 Behaviors를 간단하게 사용할 수 있는 Behaviors SDK가 추가되었다.

 

참고 포스트

http://www.silverlightshow.net/items/Windows-8.1-Behaviors-SDK-Part-1.aspx

http://www.silverlightshow.net/items/Windows-8.1-Behaviors-SDK-Part-2.aspx

 

프로젝트에서 Add Reference를 선택한 후 Windows -> Extensions에서 Behaviors SDK를 선택 

 

XAML에서 아래 2개의 네임스페이스 추가하고

 

    xmlns:t="using:Microsoft.Xaml.Interactivity"
    xmlns:c="using:Microsoft.Xaml.Interactions.Core"

    <t:Interaction.Behaviors>
        <c:EventTriggerBehavior EventName="Unloaded">
            <c:InvokeCommandAction Command="{Binding UnloadedCommand}"/>
        </c:EventTriggerBehavior>
        <c:EventTriggerBehavior EventName="Loaded">
            <c:InvokeCommandAction Command="{Binding LoadedCommand}"/>
        </c:EventTriggerBehavior>
        <c:EventTriggerBehavior EventName="SizeChanged">
            <c:InvokeCommandAction Command="{Binding SizeChangedCommand}"/>
        </c:EventTriggerBehavior>
    </t:Interaction.Behaviors>

이런 식으로 사용이 가능하다.

코딩은 직접 입력을 해도 돼고, 블랜드를 이용해서 사용할 수 있으니 자신의 스타일에 맞게 작업하면 될 것 같다.

 

참고 포스트를 읽어 보면 자신의 스타일에 맞는 Behavior를 만들어서 사용하는 부분도 나오니 부족한 기능은 자신이 만들어서 사용하도록 하자.

 

'Windows 8&8.1 > Sample&Tip 8.1' 카테고리의 다른 글

Windows Live Connect Manage  (0) 2013.12.06
Windows Store languages country list  (0) 2013.11.26
InvokeActionCommandEx  (0) 2013.11.21
Behaviors SDK  (0) 2013.11.20
adduplex event  (0) 2013.10.04
BasicApp template by rghwang  (0) 2013.10.04
블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

Win From The Future!

http://www.adduplex.com/Specials/WinFromTheFuture#.Uk5BbuiwfX7

 

Publish a Windows Phone or Windows Store app that participates in AdDuplex cross promotion network between September 12, 2013 and October 31, 2013 and you'll be automatically entered into the drawing.

 

'Windows 8&8.1 > Sample&Tip 8.1' 카테고리의 다른 글

Windows Live Connect Manage  (0) 2013.12.06
Windows Store languages country list  (0) 2013.11.26
InvokeActionCommandEx  (0) 2013.11.21
Behaviors SDK  (0) 2013.11.20
adduplex event  (0) 2013.10.04
BasicApp template by rghwang  (0) 2013.10.04
블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

BasicApp

https://github.com/rghwang/BasicApp

 

스토어에 앱을 몇번 올려보니 정작 앱 기능 구현이 어느 정도 되도 스토어 인증 기준에 맞추기 위해 마지막에 꼭 해야 하는 귀찮은 작업들이 여럿 있더라고요.(스냅뷰 추가, 개인보호 정책 추가 등) 그래서 기본 템플릿 앱에 해당 부분들을 추가해서 새로운 템플릿을 만들어 봤습니다. 오픈소스로 업데이트를 진행할 계획이라 필요한 기능 및 버그가 있으면 얼마든지 의견 및 Pull Request 보내주세요.

구현된 기능

고려 중인 업데이트

  • 공유 및 검색 참 기본 기능
  • 선택 가능한 타일 이미지 세트 추가
  • 앱바 버튼 스타일 리소스
  • 3G 데이터망 사용 옵션(비디오,오디오 스트리밍 앱에 필요)
  • 라이브 타일 기본 기능
  • 페이스북 등 소셜 SNS 로그인 및 공유 기능
  • JavaScript 버전 템플릿

'Windows 8&8.1 > Sample&Tip 8.1' 카테고리의 다른 글

Windows Live Connect Manage  (0) 2013.12.06
Windows Store languages country list  (0) 2013.11.26
InvokeActionCommandEx  (0) 2013.11.21
Behaviors SDK  (0) 2013.11.20
adduplex event  (0) 2013.10.04
BasicApp template by rghwang  (0) 2013.10.04
블로그 이미지

kaki104

/// Microsoft MVP - Windows Development - Apr 2014 ~ Mar 2018 /// email : kaki104@daum.net, twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

티스토리 툴바