Hatena::Groupmediaforcelabs

どうも、小松です。

|

2009-11-26

Timespanのフォーマット

| 14:32

どうも、小松です。


TimeSpanをtoString()メソッドで文字列にするときに、フォーマットを指定したいです。

「hh:mm:ss」とか[mm:ss]とか指定して文字列を取得したいです。

調べてみたところ、フォーマットを指定して文字列を取得するメソッドは、TimeSpanクラスにはなさそうです。


ないので、簡単なものを自分で作ってみました。

今回は、時間と分と秒のみを指定できるように指定しています。


1. 仕様。

 ・時間は「h」で指定する。

 ・分は「m」で指定する。

 ・秒は「s」で指定する。

 ・時間、分、秒ともに、文字を2つ並べた場合は2ケタ表示する。

  例:時間が「1」の場合、hhとしたら「01」と表示する。


2. フォーマットに従って、変換。

 指定したフォーマットに従って、TimeSpanを文字列に変換するメソッドを作成しました。

// 引数tsの値を、引数formatで指定した書式の文字列に変換する。
private string timeSpanFormatter(TimeSpan ts, string format)
{
    string ret = format;
    ret = ret.Replace("hh", ts.Hours.ToString("00"));
    ret = ret.Replace("h", ts.Hours.ToString("0"));
    ret = ret.Replace("mm", ts.Minutes.ToString("00"));
    ret = ret.Replace("m", ts.Minutes.ToString("0"));
    ret = ret.Replace("ss", ts.Seconds.ToString("00"));
    ret = ret.Replace("s", ts.Seconds.ToString("0"));
    return ret;
}

3. 確認。

 2で作成したメソッドを実際に使用してみます。

 実行結果は、ソースのコメントに書いています。

TimeSpan ts = new TimeSpan(1, 2, 30);
MessageBox.Show(timeSpanFormatter(ts, "h時間m分s秒"));     // 結果「1時間2分30秒」
MessageBox.Show(timeSpanFormatter(ts, "hh時間mm分ss秒"));  // 結果「01時間02分30秒」

4. 最後に。

 とりあえず、ほしい機能を実現することができたのですが、もっと簡単な方法を見つけてしまいまいた。

 Visual Basic 中学校 掲示板2というサイトにありました。

 メソッドを作成することなく、以下のように一行で文字列を取得できました。

MessageBox.Show(new DateTime(0).Add(new TimeSpan(1, 2, 30)).ToString("H時間m分s秒"));     // 結果「1時間2分30秒」
MessageBox.Show(new DateTime(0).Add(new TimeSpan(1, 2, 30)).ToString("HH時間mm分ss秒"));  // 結果「01時間02分30秒」

 以下、簡単な説明です。

  ・基準となるDateTimeをインスタンス化します。(日付は適当でよいですが、時間は、0時0分0秒にします)

  ・インスタンス化したDateTimeにフォーマット付き文字列で表したいTimeSpanを加算します。

  ・最後に、DateTime.ToString()メソッドを使用してフォーマットします。


 自分の頭の固さを痛感です。

CauaCaua2012/03/22 18:51Keep on writing and cuhgging away!

bnkongxrcebnkongxrce2012/03/22 22:06BI1B5F <a href="http://dxzsbouezfdk.com/">dxzsbouezfdk</a>

yfrqakwfitlyfrqakwfitl2012/03/23 19:493r20Wb , [url=http://dndfmdmwdarp.com/]dndfmdmwdarp[/url], [link=http://zvkwbbcqbiux.com/]zvkwbbcqbiux[/link], http://sdgzffquugtk.com/

eviemjnneviemjnn2012/03/24 02:17hm8aDr <a href="http://nmdqozihbbwa.com/">nmdqozihbbwa</a>

ChasClendyChasClendy2017/05/07 09:51Clobetasol Medication Discount Shop With Free Shipping Propecia Canada <a href=http://byuvaigranonile.com>viagra</a> Amoxicillin A Year After Expiration Date Cialis Nessun Effetto Sildenafil 50 Mgs On Sale In Canada

KennslandyKennslandy2017/06/16 07:14Propecia Discussion <a href=http://buy-cheap-viagra.via100mg.com>Buy Cheap Viagra</a> Viagra Pour Bebe Priligy Precio En Mexico <a href=http://viacheap.com>viagra</a> How Long Does Zithromax Stay In Your System Amoxicillin Indication <a href=http://order-pills-online.priliorder.com>Order Pills Online</a> Priligy Acquisto On Line

2009-11-25

AnnotationならぬAttribute

| 19:21

どうも、小松です。


JavaでいうところのAnnotation(アノテーション)をSilverlight(C#)で使いたいと思ったのですが、

検索してもなかなか見つかりません。

Validationで使用するAnnotationは見つかるのですが、カスタムのAnnotationを作成する方法は

なかなか見つかりません。

ようやく辿り着いたのがブログの記事で、.NetではAttribute(アトリビュート)が似た役割を持っているそうです。

いい情報をありがとうございます。(長い英語なのでちゃんと読んでませんが)


とりあえずAttributeを使えばいいということがわかったので試してみたいと思います。

0. はじめに

開発環境は、以下のとおりです。

OSWindows Server 2008 R2 Standard
開発ツールVisual Studio 2010 Ultimate Beta2

1. Attributeの作成。

 1-1. プロジェクトを作成します。(名前は、「TestAttribute」にしました。)

 1-2. Attributeを保存するフォルダ「Attributes」を作成します。

 1-3. Attributeを作成します。

  今回は、エンティティのプロパティの略称を付与するShortNameAtributeを作成します。

using System;

namespace TestAttribute.Attributes
{
    // Attributeクラスを継承する。
    public class ShortNameAttribute : Attribute
    {
        private string _Name;

        // コンストラクタは、Attributeが設定されるときに呼ばれる。
        public ShortNameAttribute(string value)
        {
            _Name = value;
        }

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

2. Attributeを使用する。

 2-1. Personクラスを作成し、そこでShortNameAttributeを使用して見ます。

 2-2. Personクラスを保存する「Entities」フォルダを作成します。

 2-3. Personクラスを作成します。各プロパティの略称を指定します。

using TestAttribute.Attributes;

namespace TestAttribute.Entities
{
    public class Person
    {
        [ShortName("i")]
        public int id { get; set; }

        [ShortName("fn")]
        public string FirstName { get; set; }

        [ShortName("ln")]
        public string LastName { get; set; }

        [ShortName("a")]
        public int Age { get; set; }
    }
}

3. Attributeで設定した値を取得する。

 3-1. 確認のため、2で設定した値を取得したいと思います。

  MainPage.xamlのLayoutRootがロードされたときにPersonクラスのインスタンスを作成し、

  ボタンを用意し、ボタンをクリックしたら、PersonのAttributeの値を表示します。

 3-2. MainPage.xamlです。

  ボタンを一つ用意し、あとはイベントハンドラを指定します。

<UserControl x:Class="TestAttribute.MainPage"
    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"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    <Grid x:Name="LayoutRoot"
          Background="White"
          Loaded="LayoutRoot_Loaded">
        <Button x:Name="myButton"
                Width="100" Height="30"
                Content="get attributes"
                Click="myButton_Click"/>
    </Grid>
</UserControl>

 3-3. MainPage.xaml.csです。

using System;
using System.Reflection; // for PropertyInfo
using System.Windows;
using System.Windows.Controls;
using TestAttribute.Attributes;
using TestAttribute.Entities;

namespace TestAttribute
{
    public partial class MainPage : UserControl
    {
        private Person person;

        public MainPage()
        {
            InitializeComponent();
        }

        private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
        {
            // Personをインスタンス化し、初期値を入力します。
            person = new Person() { id = 1, FirstName = "太郎", LastName = "メディア", Age = 33 };
        }

        private void myButton_Click(object sender, RoutedEventArgs e)
        {
            string str = "";

            // personの型を取得します。
            Type type = person.GetType();

            foreach (PropertyInfo pInfo in type.GetProperties())
            {
                // pInfoからShortNameAttribute型のAttributeを取得します。
                Attribute attribute = Attribute.GetCustomAttribute(pInfo, typeof(ShortNameAttribute));

                // ShortNameAttributeのNameプロパティの値を取得します。
                string name = ((ShortNameAttribute)attribute).Name;

                // strにプロパティ名、値、ShortNameAttributeのNameプロパティ値を追加します。
                str += pInfo.Name + ":\n"
                    + "  value: " + pInfo.GetValue(person, null) + "\n"
                    + "  short name: " + name + "\n";
            }

            // strをMessageBoxで表示します。
            MessageBox.Show(str);
        }
    }
}

4. 実行結果。

 f:id:coma2:20091125191429p:image

 正しく表示されました。

 次は、複数のプロパティを保持したAttributeについて調べてみたいと思います。


 **2009/12/02追記 ここから**

 複数のプロパティを持ったAttributeを試してみました。

 **2009/12/02追記 ここまで**

HelenaHelena2012/02/20 13:51Good job miakng it appear easy.

pwkzswpqipppwkzswpqipp2012/02/21 18:14iIgpZi <a href="http://nivnptrvjbsq.com/">nivnptrvjbsq</a>

katkzmetkatkzmet2012/02/21 23:01huFkYG , [url=http://shhgniakqehb.com/]shhgniakqehb[/url], [link=http://dejpkuldllcq.com/]dejpkuldllcq[/link], http://fztdszwizlcx.com/

2009-11-18

Windowsのリカバリディスクが起動しません。

| 15:55

どうも、小松です。


LinuxインストールしていたPCにWindows XPインストールしようとしたところ、Windowsリカバリディスクが起動せず真っ黒な画面になりました。

Microsoftのサイトによると、Linuxパーティションを削除してからWindowsインストールする必要があるようです。

このサイトでは、fdiskコマンドでパーティションを削除しています。



私が試した手順は、以下の通りです。

0. はじめに

 ハードディスクの中身をすべて削除することを前提として作業を行いました。

 大切なデータがある場合は、バックアップを取ってください。

 OS情報は以下の通りです。

最初にインストールされていたOSCentOS 5.3
今回インストールしたOSWindows XP Professional

1. CentOSインストールメディアからlinux rescueモードで起動。

 インストールの最初の画面が表示されたら、「linux rescue」と入力します。


2. MBRを削除し、パーティションテーブルを削除。

 以下のコマンドを実行し、MBRを削除します。

dd if=/dev/zero of=/dev/sda bs=512 count=1

 ハードディスクの先頭512バイトに0をコピーします。

 ddコマンドの引数の簡単な説明は以下の通りです。

if入力ファイル
of出力ファイル
bs一度に入出力するブロックのサイズ
count入出力するブロックの数

 詳細は、manpageで確認してください。


3. linux rescueモードを終了。

 exitコマンドで終了し、PCをシャットダウンします。


4. Windowsインストール

 リカバリディスクからブートしてインストールします。


5. 最後に。

 試しておりませんが、KNOPPIXUbuntuをCDブート・USBブートして手順2から行ってもWindowsインストールできるはずです。

 また、同じような状況に出くわしたら試してみたいと思います。

SukhmoySukhmoy2013/04/25 04:12Super excited to see more of this kind of stuff olinne.

brsmdhpqyxpbrsmdhpqyxp2013/04/27 00:30Gr8xqL <a href="http://wjookocqrvqy.com/">wjookocqrvqy</a>

qtytutkpmqtytutkpm2013/04/27 00:30ahBD64 <a href="http://annfdoxodmff.com/">annfdoxodmff</a>

wtzgblwtzgbl2013/04/27 11:117Vidm0 , [url=http://bpnnrspoxwip.com/]bpnnrspoxwip[/url], [link=http://cictorofaplq.com/]cictorofaplq[/link], http://oovrilzbutoc.com/

cocatrovococatrovo2013/04/30 05:46CDqfEr , [url=http://gvkrlbdrossn.com/]gvkrlbdrossn[/url], [link=http://uooyucvquptf.com/]uooyucvquptf[/link], http://lujahrsdxtdx.com/

2009-11-12

XamlReaderを使用してみました -その1-

| 10:41

どうも、小松です。


XamlReaderを使用してみました。

XamlReaderとは、プログラムからXAMLを読み込むためのクラスです。

あまり使うことのなさそうなクラスですが、試してみました。


0. はじめに

開発環境は、以下のとおりです。

OSWindows Server 2008 R2 Standard
開発ツールVisual Studio 2010 Ultimate Beta2

1. プロジェクト作成。

 1-1. プロジェクトを作成します。(名前は、「TestXamlReader1」にしました。)

 1-2. MainPage.xamlでLayoutRootのLoadedイベント対して、イベントハンドラを設定します。


 MainPage.xaml

<UserControl x:Class="TestXamlReader1.MainPage"
    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"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    <Grid x:Name="LayoutRoot" Background="White" Loaded="LayoutRoot_Loaded"/>
</UserControl>

2. XamlReaderの使用。

 2-1. XamlReader.LoadメソッドでXAMLを解析しますが、注意点があります。

   ・XAML コンテンツの文字列は単一のルート要素を定義しなければならない。

   ・ルート要素に既定の XML 名前空間を指定しなければならない。

  詳細は、MSDNライブラリに載っています。

  他にも色々書いてありますので、確認して見て下さい。

 2-2. 実際にXAMLを解析し、LayoutRootのChildrenに追加してみます。


 MainPage.xaml.cs

using System.Windows;
using System.Windows.Controls;
using System.Windows.Markup; // for XamlReader

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

        private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
        {
            // XamlReaderで解析するためのXAML文字列
            string xaml = @"
<Canvas xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
        Width=""300"" Height=""300""
        Background=""Gold"">
    <Button Width=""100"" Height=""20""
            Canvas.Left=""50"" Canvas.Top=""50""
            Content=""ボタンA""/>
</Canvas>
";

            // xamlを解析し、Canvasをルートとするツリーを取得
            Canvas canvas = (Canvas)XamlReader.Load(xaml);

            // LayoutRootの子にcanvasを追加
            ((Grid)sender).Children.Add(canvas);
        }
    }
}

3. 実行結果。

 XAMLを読み込むことができました。

  f:id:coma2:20091112103946p:image


 次回は、もう少しだけレベルアップしたXamlReaderの使い方を試したいと思います。

2009-11-09

Illustratorデータを取り込む(Button編 -その2-)

| 11:31

どうも、小松です。


Illustratorのデータを取り込んで、ボタンを作成してみます。

その1からだいぶ間隔が空いてしまいましたが、気にせず突き進みたいと思います。


0. はじめに

開発環境は、以下のとおりです。

OSWindows XP Professional
開発ツールExpression Blend 3(日本語)

Illustratorのデータを準備します。(私はIllustratorを使えないので、またまたデザイナーさんにお願いしちゃいました。)

前回と同様に異なる色のボタンを4つ重ねたデータをお願いしたのですが、

今回は、4つのボタンをそれぞれ別のレイヤーにしてもらいました。

繰り返しになりますが、4つの色が必要なのは、以下の状態を表すためです。

  • 通常の状態
  • マウスオーバーした状態
  • クリックした状態
  • ボタンが無効の状態(クリックできない状態)

1. プロジェクトにIllustratorのデータを取り込む。

 1-1. プロジェクトを作成します。(名前は、「TestCustomButton2」にしました。)

 1-2. メニューバーより、「ファイル」->「Adobe Illustrator ファイルのインポート」を開きます。

 1-3. 取り込むファイルを選択し、「開く」ボタンをクリックします。(今回は、「btn_images2.ai」というファイルを開きました。)

 1-4. データがインポートできました。「オブジェクトタイムライン」パネルで確認すると以下の通りです。

  f:id:coma2:20091106215728p:image

  4つのCanvasの中にPathが1つずつ入っています。

  CanvasIllustratorレイヤー、Pathがボタンのオブジェクトに対応しています。

  ボタン自身(Path)には名前はつきませんが、レイヤー(Canvas)の名前は、Illustratorで定義した名前です。

  名前が表示されるととても便利です。


2. 取り込んだデータをボタンに変更する。

 2-1. 「オブジェクトタイムライン」パネルで4つのCanvasを選択し、右クリックします。

 2-2. 「グループ化設定」->「Grid」を選択します。

  f:id:coma2:20091020105917p:image

 2-3. 新しくGridが作成され、その中に4つのCanvasが入ります。

 2-4. 作成されたGridを右クリックし、「コントロールの作成」を選択します。

  f:id:coma2:20091020114409p:image

 2-5. 「コントロールの種類」で「Button」を選び、「OK」ボタンをクリックします。

  f:id:coma2:20091020115123p:image


3. テンプレートの編集を行う。

 3-1. テンプレート編集モードになります。

 3-2. 4つのCanvasのVisibilityプロパティを「Collapsed」にします。

  3-2-1. 「オブジェクトタイムライン」パネルで「btn_disabled」を選択します。

   f:id:coma2:20091109113008p:image

  3-2-2. 「プロパティ」パネルの「外観」セクションでVisibilityプロパティを「Collapsed」にします。

   f:id:coma2:20091020123957p:image

  3-2-3. 他の3つのCanvasも同様に操作します。

 3-3. 状態の設定を行う。

  各状態で、表示するCanvasのVisibilityプロパティを「Visible」にします。

  3-3-1. 「状態」ウィンドウを開き、「Normal」状態を選択します。

   f:id:coma2:20091020123958p:image

  3-3-2. 「オブジェクトタイムライン」パネルで「btn_normal」を選択します。

  3-3-3. 「プロパティ」パネルの「外観」セクションでVisibilityプロパティを「Visible」にします。

  3-3-4. 同様に、MouseOver, Pressed, Disabledの3つの状態も設定します。


4. ボタンのContent(文字)を消す。

  4-1. 「オブジェクトタイムライン」パネルで「[ContentPresenter]」を選択します。

  4-2. 「プロパティ」パネルの「共通プロパティ」セクションで「Content」の値を削除します。


5. 最後に

 このボタン作成の方法は、Illustratorで定義した名前が表示されて便利でした。

 ただし、大きな問題点があります。それは、ボタンのサイズ変更が出来ないということです。

 テンプレートの編集時に、全てのCanvasとPathのWidth,HeightをAutoにしてもダメでした。

 その1では、サイズ変更が出来ました。

 どちらも一長一短がありますね。


 参考に、ソースコードを載せておきます。

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="TestCustomButton2.MainPage"
    Width="640" Height="480">
    <UserControl.Resources>
        <Style x:Key="ButtonStyle1" TargetType="Button">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Grid>
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="FocusStates">
                                    <VisualState x:Name="Focused"/>
                                    <VisualState x:Name="Unfocused"/>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="btn_normal" Storyboard.TargetProperty="(UIElement.Visibility)">
                                                <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Visible</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="MouseOver">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="btn_mouseover" Storyboard.TargetProperty="(UIElement.Visibility)">
                                                <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Visible</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Pressed">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="btn_pressed" Storyboard.TargetProperty="(UIElement.Visibility)">
                                                <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Visible</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Disabled">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="btn_disabled" Storyboard.TargetProperty="(UIElement.Visibility)">
                                                <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Visible</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Canvas x:Name="btn_disabled" Height="35.653" Width="100.618" Visibility="Collapsed">
                                <Path Stretch="Fill" Stroke="#FF666666" StrokeEndLineCap="Flat" StrokeLineJoin="Miter" StrokeMiterLimit="4" StrokeStartLineCap="Flat" StrokeThickness="1" Height="36.653" Width="101.618" Canvas.Left="-0.5" Canvas.Top="-0.5" Data="M472.191,312.975C472.191,315.184,470.4,316.975,468.191,316.975L375.573,316.975C373.364,316.975,371.573,315.184,371.573,312.975L371.573,285.322C371.573,283.113,373.364,281.322,375.573,281.322L468.191,281.322C470.4,281.322,472.191,283.113,472.191,285.322L472.191,312.975z">
                                    <Path.Fill>
                                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                            <GradientStop Color="#FFB1B1B1" Offset="0"/>
                                            <GradientStop Color="sc#1, 0.350953937, 0.350953937, 0.350953937" Offset="0.26369800128793719"/>
                                            <GradientStop Color="#FF8C8C8C" Offset="0.43258398771286011"/>
                                            <GradientStop Color="#FF666666" Offset="0.53370797634124756"/>
                                            <GradientStop Color="#FF666666" Offset="1"/>
                                        </LinearGradientBrush>
                                    </Path.Fill>
                                </Path>
                            </Canvas>
                            <Canvas x:Name="btn_pressed" Height="35.653" Width="100.618" Visibility="Collapsed">
                                <Path Stretch="Fill" Stroke="Blue" StrokeEndLineCap="Flat" StrokeLineJoin="Miter" StrokeMiterLimit="4" StrokeStartLineCap="Flat" StrokeThickness="1" Height="36.653" Width="101.618" Canvas.Left="-0.5" Canvas.Top="-0.5" Data="M472.191,312.975C472.191,315.184,470.4,316.975,468.191,316.975L375.573,316.975C373.364,316.975,371.573,315.184,371.573,312.975L371.573,285.322C371.573,283.113,373.364,281.322,375.573,281.322L468.191,281.322C470.4,281.322,472.191,283.113,472.191,285.322L472.191,312.975z">
                                    <Path.Fill>
                                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                            <GradientStop Color="#FFBDBDFF" Offset="0"/>
                                            <GradientStop Color="sc#1, 0.273542851, 0.273542851, 1" Offset="0.26369800128793719"/>
                                            <GradientStop Color="#FF3737FF" Offset="0.43258398771286011"/>
                                            <GradientStop Color="Blue" Offset="0.53370797634124756"/>
                                            <GradientStop Color="Blue" Offset="1"/>
                                        </LinearGradientBrush>
                                    </Path.Fill>
                                </Path>
                            </Canvas>
                            <Canvas x:Name="btn_mouseover" Height="35.653" Width="100.618" Visibility="Collapsed">
                                <Path Stretch="Fill" Stroke="#FF008FCB" StrokeEndLineCap="Flat" StrokeLineJoin="Miter" StrokeMiterLimit="4" StrokeStartLineCap="Flat" StrokeThickness="1" Height="36.653" Width="101.618" Canvas.Left="-0.5" Canvas.Top="-0.5" Data="M472.191,312.975C472.191,315.184,470.4,316.975,468.191,316.975L375.573,316.975C373.364,316.975,371.573,315.184,371.573,312.975L371.573,285.322C371.573,283.113,373.364,281.322,375.573,281.322L468.191,281.322C470.4,281.322,472.191,283.113,472.191,285.322L472.191,312.975z">
                                    <Path.Fill>
                                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                            <GradientStop Color="#FFB8DFF0" Offset="0"/>
                                            <GradientStop Color="sc#1, 0.28398788, 0.5943481, 0.80091393" Offset="0.26369800128793719"/>
                                            <GradientStop Color="#FF54B3DE" Offset="0.43258398771286011"/>
                                            <GradientStop Color="#FF0993CE" Offset="0.53370797634124756"/>
                                            <GradientStop Color="#FF0993CE" Offset="1"/>
                                        </LinearGradientBrush>
                                    </Path.Fill>
                                </Path>
                            </Canvas>
                            <Canvas x:Name="btn_normal" Height="35.653" Width="100.618" Visibility="Collapsed">
                                <Path Stretch="Fill" Stroke="#FF5DB8DF" StrokeEndLineCap="Flat" StrokeLineJoin="Miter" StrokeMiterLimit="4" StrokeStartLineCap="Flat" StrokeThickness="1" Height="36.653" Width="101.618" Canvas.Left="-0.5" Canvas.Top="-0.5" Data="M472.191,312.975C472.191,315.184,470.4,316.975,468.191,316.975L375.573,316.975C373.364,316.975,371.573,315.184,371.573,312.975L371.573,285.322C371.573,283.113,373.364,281.322,375.573,281.322L468.191,281.322C470.4,281.322,472.191,283.113,472.191,285.322L472.191,312.975z">
                                    <Path.Fill>
                                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                            <GradientStop Color="#FFD8EDF6" Offset="0"/>
                                            <GradientStop Color="sc#1, 0.5977833, 0.8036989, 0.9047525" Offset="0.26369800128793719"/>
                                            <GradientStop Color="#FFBDE2F2" Offset="0.43258398771286011"/>
                                            <GradientStop Color="#FF5DB8DE" Offset="0.53370797634124756"/>
                                            <GradientStop Color="#FF5DB8DE" Offset="1"/>
                                        </LinearGradientBrush>
                                    </Path.Fill>
                                </Path>
                            </Canvas>
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content=""/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="White">
        <Canvas x:Name="btn_images2" Height="595.276" HorizontalAlignment="Left" VerticalAlignment="Top" Width="841.89">
            <Button Height="36" Style="{StaticResource ButtonStyle1}" Width="101" Canvas.Left="372" Canvas.Top="281" Content="Button"/>
        </Canvas>
    </Grid>
</UserControl>

LaxmanLaxman2013/04/27 13:49Deep thinking - adds a new dmeinsion to it all.

|