カテゴリー別アーカイブ: C#

【Silverlight】 カスタム検証属性を作成するには

◆検証属性(数値チェック)

using System;
using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;

namespace Validations.ValidationAttributes
{
  [AttributeUsage(AttributeTargets.Property
    , AllowMultiple = true, Inherited = true)]
  public class NumberStringAttribute : ValidationAttribute
  {
    public NumberStringAttribute()
    {
        // エラーメッセージ
      this.ErrorMessage = "{0}は数値文字を入力してください。";
    }

    protected override ValidationResult IsValid
      (object value, ValidationContext validationContext)
    {
      if (value.ToString().Length == 0)
        return ValidationResult.Success;

      // 数値チェック
      if (new Regex("^([0-9])*$").IsMatch(value.ToString() ))
        return ValidationResult.Success;
      else
        return new ValidationResult(string.Empty);
    }    
  }
}

◆使用例(プロパティに NumberStringAttribute を適用)

[NumberString()]
public string Age
{
  get { return Model.Age; }
  set
  {
    Model.Age = value;
    this.RaisePropertyChanged(() => Age);
  }
}

広告

【Silverlight】 クエリ文字列を設定して、画面遷移を行うには

◆ メイン画面(XAML)

<UserControl
  x:Class="SilverlightApplication7.MainPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:navigation="clr-namespace:System.Windows.Controls;
    assembly=System.Windows.Controls.Navigation" 
  xmlns:uriMapper="clr-namespace:System.Windows.Navigation;
    assembly=System.Windows.Controls.Navigation"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">

  <Grid x:Name="LayoutRoot">
    <StackPanel>
      <Button Width="100" HorizontalAlignment="Left"
        Content="遷移" Name="btnNavigate"></Button>
      <navigation:Frame x:Name="ContentFrame" Source="/Home">
        <navigation:Frame.UriMapper>
          <uriMapper:UriMapper>
            <uriMapper:UriMapping Uri="/{pageName}"
              MappedUri="/Views/{pageName}.xaml"/>
          </uriMapper:UriMapper>
        </navigation:Frame.UriMapper>
      </navigation:Frame>
    </StackPanel>
  </Grid>

◆ メイン画面(C# Code)

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;

namespace SilverlightApplication7
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            this.btnNavigate.Click += (s, e) =>
            {
                // About画面へ遷移(クエリ文字列「id」に "test" を設定)
                this.ContentFrame.Navigate(
                  new Uri("/About?id=test", UriKind.Relative));
            };

            this.ContentFrame.NavigationFailed += (s, e) =>
            {
                MessageBox.Show("画面遷移エラー");
            };            
        }        
    }
}

◆ About画面(C# Code)

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;

namespace SilverlightApplication7
{
    public partial class About : Page
    {
        public About()
        {
            InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            // クエリ文字列「id」の取得
            MessageBox.Show(this.NavigationContext.QueryString["id"]);
        }
    }
}

【Silverlight】 コンテキストメニューを表示するには

◆ 事前準備

1. Silverlight Toolkit をインストール
  ★NuGet
    http://nuget.org/List/Packages/SilverlightToolkit-All    
  ★インストーラー
    http://silverlight.codeplex.com/releases/view/43528

2. System.Windows.Controls.Input.Toolkit.dll を参照設定

◆ XAML

<UserControl x:Class="Views.TestView"
  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:controlsInputToolkit="clr-namespace:System.Windows.Controls;
    assembly=System.Windows.Controls.Input.Toolkit"
  mc:Ignorable="d"
  d:DesignHeight="300" d:DesignWidth="400">
  
  <Grid x:Name="LayoutRoot">
    <StackPanel HorizontalAlignment="Left">
      <TextBox Name="txtContextMenu" Height="30" Width="200">
        <controlsInputToolkit:ContextMenuService.ContextMenu>
          <controlsInputToolkit:ContextMenu Height="90" 
              Name="contextMenu1" Width="160">
            <controlsInputToolkit:MenuItem x:Name="MenuCopy"
                Header="コピー" Click="MenuCopy_Click">
              <controlsInputToolkit:MenuItem.Icon>
                <Image Height="25" Width="25" Source="Copy.png"></Image>
              </controlsInputToolkit:MenuItem.Icon>
            </controlsInputToolkit:MenuItem>
            <controlsInputToolkit:MenuItem x:Name="MenuPaste" 
                Header="貼り付け" Click="MenuPaste_Click">
              <controlsInputToolkit:MenuItem.Icon>
                <Image Height="25" Width="25" Source="Paste.png"></Image>
              </controlsInputToolkit:MenuItem.Icon>
            </controlsInputToolkit:MenuItem>
            <controlsInputToolkit:Separator />
            <controlsInputToolkit:MenuItem x:Name="MenuCut" 
                Header="切り取り" Click="MenuCut_Click">
              <controlsInputToolkit:MenuItem.Icon>
                <Image Height="25" Width="25" Source="Cut.png"></Image>
              </controlsInputToolkit:MenuItem.Icon>
            </controlsInputToolkit:MenuItem>
          </controlsInputToolkit:ContextMenu>
        </controlsInputToolkit:ContextMenuService.ContextMenu>
      </TextBox>      
    </StackPanel>    
  </Grid>
</UserControl>

◆ C# Code

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace Views
{
    public partial class TestView : UserControl
    {
        public TestView()
        {
            InitializeComponent();

            this.MouseRightButtonDown += (s, e) =>
            {
                e.Handled = true;
            };
        }

        // コピー
        private void MenuCopy_Click(object sender, RoutedEventArgs e)
        {
            Clipboard.SetText(this.txtContextMenu.Text);
        }

        // 貼り付け
        private void MenuPaste_Click(object sender, RoutedEventArgs e)
        {
            this.txtContextMenu.Text = Clipboard.GetText();
        }

        // 切り取り
        private void MenuCut_Click(object sender, RoutedEventArgs e)
        {
            Clipboard.SetText(this.txtContextMenu.Text);
            this.txtContextMenu.Text = string.Empty;
        }
    }
}

【Silverlight】 DataGrid に グループを設定するには

◆ XAML

<UserControl x:Class="Views.GroupView "
    <Grid x:Name="LayoutRoot" Background="White">
        <StackPanel>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                <Button Name="btnSetGroup" Click="btnSetGroup_Click" 
                    Content="グループ設定" Height="30" Width="140"></Button>
                <Button Name="btnClearGroup" Click="btnClearGroup_Click" 
                    Content="グループ解除" Height="30" Width="140"></Button>
            </StackPanel>
            <TextBlock Height="10" />
            <sdk:DataGrid Name="dataGrid1" Width="300" Height="300" 
                IsReadOnly="True" AutoGenerateColumns="True"
                HorizontalAlignment="Left"/>
        </StackPanel>
    </Grid>
</UserControl>

◆ C# Code

using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace Views
{
    public partial class GroupView : UserControl
    {
        public GroupView()
        {
            InitializeComponent();
        }

        // DataGird表示用エンティティ
        public class User
        {
            public string name { get; set; }
            public int age { get; set; }            
        }

        // グループ設定 イベント
        private void btnSetGroup_Click(object sender, RoutedEventArgs e)
        {
            // データ
            User[] userArray = {
                        new User { name="Taro", age=20},
                        new User { name="Jiro", age=25},
                        new User { name="Saburo", age=30},
                        new User { name="Shiro", age=35},
                        new User { name="Goro", age=40},
                        new User { name="Rokuro", age=20},
                        new User { name="Nanaro", age=40},
                        new User { name="Hachiro", age=40},
                    };

            // PagedCollectionView へ変換してセット
            this.dataGrid1.ItemsSource = new PagedCollectionView(userArray);

            // グループ設定
            var pcv = this.dataGrid1.ItemsSource as PagedCollectionView;
            if (pcv != null && pcv.CanGroup == true)
            {
                // グループ条件
                pcv.GroupDescriptions.Add(
                    new PropertyGroupDescription("age"));
            }
        }

        // グループ解除 イベント
        private void btnClearGroup_Click(object sender, RoutedEventArgs e)
        {
            // グループ解除
            var pcv = this.dataGrid1.ItemsSource as PagedCollectionView;
            if (pcv != null)
            {
                pcv.GroupDescriptions.Clear();
            }
        }
    }
}

【Silverlight】 DataGrid に ソートを設定するには

◆ XAML

<UserControl x:Class="Views.SortView "
    <Grid x:Name="LayoutRoot" Background="White">
        <StackPanel>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                <Button Name="btnSetSort" Click="btnSetSort_Click" 
                    Content="ソート設定" Height="30" Width="120"></Button>
                <Button Name="btnClearSort" Click="btnClearSort_Click" 
                    Content="ソート解除" Height="30" Width="120"></Button>
            </StackPanel>
            <TextBlock Height="10" />
            <sdk:DataGrid Name="dataGrid1" Width="300" Height="300" 
                IsReadOnly="True" AutoGenerateColumns="True"
                HorizontalAlignment="Left"/>
        </StackPanel>
    </Grid>
</UserControl>

◆ C# Code

using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.ComponentModel;

namespace Views
{
    public partial class SortView : UserControl
    {
        public SortView()
        {
            InitializeComponent();
        }

        // DataGird表示用エンティティ
        public class User
        {
            public string name { get; set; }
            public int age { get; set; }            
        }

        // ソート設定 イベント
        private void btnSetSort_Click(object sender, RoutedEventArgs e)
        {
            // データ
            User[] userArray = {
                        new User { name="Taro", age=20},
                        new User { name="Jiro", age=25},
                        new User { name="Saburo", age=30},
                        new User { name="Shiro", age=35},
                        new User { name="Goro", age=40},
                    };

            // PagedCollectionView へ変換してセット
            this.dataGrid1.ItemsSource = new PagedCollectionView(userArray);

            // ソート設定
            var pcv = this.dataGrid1.ItemsSource as PagedCollectionView;
            if (pcv != null && pcv.CanSort == true)
            {
                // ソート条件
                pcv.SortDescriptions.Add(
                  new SortDescription("name", ListSortDirection.Ascending));
            }
        }

        // ソート解除 イベント
        private void btnClearSort_Click(object sender, RoutedEventArgs e)
        {
            // ソート解除
            var pcv = this.dataGrid1.ItemsSource as PagedCollectionView;
            if (pcv != null)
            {
                pcv.SortDescriptions.Clear();
            }
        }
    }
}

【Silverlight】 DataGrid に フィルターを設定するには

◆ XAML

<UserControl x:Class="Views.FilterView "
    <Grid x:Name="LayoutRoot" Background="White">
        <StackPanel>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                <Button Name="btnSetFilter" Click="btnSetFilter_Click" 
                    Content="フィルター設定" Height="30" Width="140"></Button>
                <Button Name="btnClearFilter" Click="btnClearFilter_Click" 
                    Content="フィルター解除" Height="30" Width="140"></Button>
            </StackPanel>
            <TextBlock Height="10" />
            <sdk:DataGrid Name="dataGrid1" Width="300" Height="300" 
                IsReadOnly="True" AutoGenerateColumns="True"
                HorizontalAlignment="Left"/>
        </StackPanel>
    </Grid>
</UserControl>

◆ C# Code

using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace Views
{
    public partial class FilterView : UserControl
    {
        public FilterView()
        {
            InitializeComponent();
        }

        // DataGird表示用エンティティ
        public class User
        {
            public string name { get; set; }
            public int age { get; set; }            
        }

        // フィルター設定 イベント
        private void btnSetFilter_Click(object sender, RoutedEventArgs e)
        {
            // データ
            User[] userArray = {
                        new User { name="Taro", age=20},
                        new User { name="Jiro", age=25},
                        new User { name="Saburo", age=30},
                        new User { name="Shiro", age=35},
                        new User { name="Goro", age=40},
                    };

            // PagedCollectionView へ変換してセット
            this.dataGrid1.ItemsSource = new PagedCollectionView(userArray);

            // フィルター設定
            var pcv = this.dataGrid1.ItemsSource as PagedCollectionView;
            if (pcv != null && pcv.CanFilter == true)
            {
                // フィルター条件
                pcv.Filter = (o) => (o as User).age >= 30);
            }
        }

        // フィルター解除 イベント
        private void btnClearFilter_Click(object sender, RoutedEventArgs e)
        {
            // フィルター解除
            var pcv = this.dataGrid1.ItemsSource as PagedCollectionView;
            if (pcv != null)
            {
                pcv.Filter = null;
            }
        }
    }
}

【Silverlight】 ログイン認証で、WCF RIA Servicesの利用制限を行うには

◆ 認証機能は、前回のログイン認証を利用

using System.Linq;
using System.ServiceModel.DomainServices.Hosting;
using System.ServiceModel.DomainServices.Server;

namespace Web.Services.LoginService
{
    [EnableClientAccess()]
    public class LoginTestService : DomainServiceBase
    {
        // RequiresAuthentication属性を適用した場合、
        // 認証済みユーザーのみアクセス可能となる。
        [RequiresAuthentication()]
        public IQueryable<Uma> GetUmas()
        {
            return base.GetQuery<Uma>();
        }

        // RequiresRole属性を適用した場合、
        // ロールに所属するユーザーのみアクセス可能となる。
        [RequiresRole("Administrator")]
        public void UpdateUma(Uma entity)
        {
            base.UpdateQuery<Uma>(entity);
        }
    }
}