SplitButton - wpfコントロール

wpfのスプリットボタンを作ってみました。

まずは、コードです。

 

 

using System;

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

using System.Windows.Input;

using System.Windows.Controls.Primitives;

 

namespace OkaSharp{

[TemplatePart(Name = "PART_ActionButton", Type = typeof(Button))]
[TemplatePart(Name = "PART_DropDownButton", Type = typeof(ToggleButton))]
public class SplitButton : Control
{
static SplitButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(SplitButton), new FrameworkPropertyMetadata(typeof(SplitButton)));
}

public SplitButton()
{
DefaultStyleKey = typeof(SplitButton);
this.IsTabStop = true;

var binding = new Binding("DropDownContextMenu.IsOpen") { Source = DropDownButtonElement };
this.SetBinding(ToggleButton.IsCheckedProperty, binding);
}

public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register(
"Content", typeof(object), typeof(SplitButton),
new PropertyMetadata(((Object)"")));

public object Content
{
get
{
return (object)GetValue(ContentProperty);
}

set
{


SetValue(ContentProperty, value);

 

}
}

public static readonly DependencyProperty DropDownContentProperty =
DependencyProperty.Register(
"DropDownContent", typeof(object), typeof(SplitButton),
new PropertyMetadata(((Object)"")));

public object DropDownContent
{
get
{
return (object)GetValue(DropDownContentProperty);
}

set
{


SetValue(DropDownContentProperty, value);

 

}
}

public static readonly RoutedEvent ActionClickEvent =
EventManager.RegisterRoutedEvent("ActionClick", RoutingStrategy.Direct,
typeof(System.Windows.RoutedEventHandler), typeof(DropDownMenuButton));

public event System.Windows.RoutedEventHandler ActionClick
{
add { AddHandler(ActionClickEvent, value); }
remove { RemoveHandler(ActionClickEvent, value); }
}

/// <summary>
/// ドロップ ダウンとして表示するコンテキスト メニューを取得または設定します。
/// </summary>

 

private void UpdateStates(bool useTransitions)
{


}

public override void OnApplyTemplate()
{
ActionButtonElement = GetTemplateChild("PART_ActionButton") as Button;
DropDownButtonElement = GetTemplateChild("PART_DropDownButton") as ToggleButton;
//TextElement = GetTemplateChild("TextBlock") as TextBlock;

UpdateStates(false);
}

private Button actionButtonElement;

private Button ActionButtonElement
{
get
{
return actionButtonElement;
}

set
{
if (actionButtonElement != null)
{
actionButtonElement.Click -=
new RoutedEventHandler(actionButtonElement_Click);
}
actionButtonElement = value;

if (actionButtonElement != null)
{
actionButtonElement.Click +=
new RoutedEventHandler(actionButtonElement_Click);
}
}
}

void actionButtonElement_Click(object sender, RoutedEventArgs e)
{
RaiseEvent(new RoutedEventArgs(ActionClickEvent, this));
}

private ToggleButton dropDownButtonElement;

private ToggleButton DropDownButtonElement
{
get
{
return dropDownButtonElement;
}

set
{
if (dropDownButtonElement != null)
{
dropDownButtonElement.Click -=
new RoutedEventHandler(dropDownButtonElement_Click);
}
dropDownButtonElement = value;

if (dropDownButtonElement != null)
{
dropDownButtonElement.Click +=
new RoutedEventHandler(dropDownButtonElement_Click);
}
}
}

void dropDownButtonElement_Click(object sender, RoutedEventArgs e)
{

}

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
Focus();
}


protected override void OnGotFocus(RoutedEventArgs e)
{
base.OnGotFocus(e);
UpdateStates(true);
}

protected override void OnLostFocus(RoutedEventArgs e)
{
base.OnLostFocus(e);
UpdateStates(true);
}
}

}

 

次に、スタイルです。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:OkaSharp"
>

 

<Style x:Key="{x:Type local:SplitButton}" TargetType="{x:Type local:SplitButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:SplitButton">
<Grid Background="{TemplateBinding Background}">

 


<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>


<Button Name="PART_ActionButton"
Grid.Row="0"
Grid.Column="0"
Content="{TemplateBinding Content}" />
<ToggleButton Name="PART_DropDownButton"
Grid.Row="0"
Grid.Column="1"
Content="▼" />

 

</Grid>

<Popup AllowsTransparency="True"
Focusable="False"
HorizontalOffset="1"
IsOpen="{Binding Path=IsChecked,
ElementName=PART_DropDownButton}"
Placement="Bottom"
StaysOpen="False"
VerticalOffset="1">
<Border Background="White" BorderBrush="Gray">
<ContentPresenter Content="{TemplateBinding DropDownContent}" />

</Border>
</Popup>


</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

</ResourceDictionary>

 

 

 

 

 

 

C Sharp

C#

 
 
   
C#
C#のロゴマーク。テキスト上では#と代替表記されるが、正式には♯と描く。
パラダイム 構造化, 命令型, オブジェクト指向, 関数型, イベント駆動型, ジェネリック, リフレクション, 並行計算
登場時期 2000年
設計者 マイクロソフトアンダース・ヘルスバーグ率いるチーム)
開発者 マイクロソフト
最新リリース 5.0 / 2012年8月15日(2年前)
型付け 強い静的型付け(4.0から動的型導入)
主な処理系 共通言語ランタイム, Mono, DotGNU
方言 1.0, 1.5, 2.0 (ECMA), 3.0, 3.5, 4.0, 5.0
影響を受けた言語 C++, Delphi, Eiffel, Java,LISP
影響を与えた言語 D言語, F#, Java,Nemerle, Vala
プラットフォーム Microsoft Windows

C#(シーシャープ)とは、マイクロソフトが開発したマルチパラダイムプログラミング言語。強い型付け命令型宣言型手続き型関数型ジェネリックオブジェクト指向の要素を持つ。

マイクロソフトソフトウェアフレームワークである.NET Frameworkとともに作られ、Ecma International[1]および国際標準化機構 (ISO)[2] によって標準化されており、日本においても日本工業規格 (JIS)[3]によって採択された。

概要

開発にはボーランド社のTurbo PascalDelphiを開発したアンダース・ヘルスバーグを筆頭に多数のDelphi開発陣が参加している。

C#共通言語基盤共通言語ランタイムなど)が解釈する共通中間言語コンパイルされて実行される。基本的な書式がC言語風になっているため、初見の構文はサン・マイクロシステムズ社によるJavaに近いと言われるが、実際の構文はDelphiに準じており、C言語風ということもありC++ Builderの独自拡張構文に極めて近い内容となっている。またプロパティデリゲートなどDelphiの構文そのまま、もしくは名称変更しただけの機能となっているものが多い。

自動ボックス化デリゲートプロパティインデクサカスタム属性ポインタ演算操作、構造体(値型オブジェクト)、多次元配列可変長引数、などの機能を持つ。また、Javaと同様に大規模ライブラリプロセッサ・アーキテクチャに依存しない実行形態、ガベージコレクションJITコンパイルによる実行の高速化、などが実現されている(もっともこれらはC#の機能というより.NET Frameworkによるものである)。

.NET構想における中心的な開発言語であり、XML WebサービスASP.NETの記述にも使用される。他の.NET系の言語でも記述可能だが、生産性・機能においてC#が最も優れるとされる。マイクロソフト統合開発環境では、Microsoft Visual C#C#に対応している。

共通言語仕様のCLSによって、他のCLS準拠の言語(Visual Basic .NETVisual C++ (C++/CLI)など)と相互に連携することができる。他言語で記述されたクラス継承することも、またその逆も可能である。

言語仕様[編集]

さまざまな意味において、基盤であるCLIの機能をもっとも反映している言語であるといえる。C#にある組み込み型のほとんどは、CLIフレームワークに実装されている値型と対応している。しかし、C#の言語仕様はコンパイラのコード生成については何も言及していない。つまり、CLRに対応しなければならないとか、共通中間言語 (CIL) などの特定のフォーマットのコードを生成しなければならないとかいうことは述べられていない。そのため、理論的にはC++FORTRANのように環境依存のマシン語を生成することも可能である。しかし、現在存在するすべてのC#コンパイラCLIをターゲットにしている。

CやC++からの改良

C#では、CやC++と比較してさまざまな制限や改良が加えられている。その例を次に挙げる。

  • グローバル変数やグローバルメソッドは存在しない。すべてのメソッドとメンバはクラスの一部として宣言されなければならない。
  • 外のブロックで宣言した変数名を、内のブロックで再宣言してはいけない。これはC++ではしばしば混乱や曖昧のもととされているが、C#では禁止されている。
  • Cのprintf()関数のように関数をグローバルで公開するのではなく、すべての関数はクラス内で宣言されなければならない。ほとんどの場合クラスは名前の衝突を避けるために名前空間に所属する。
  • 名前空間は階層構造をもつ。つまり、名前空間は他の名前空間の中に宣言することができる。
  • 原始型を含めたすべての型は、objectクラスの派生クラスである。つまりobjectクラスのもつすべてのプロパティやメソッドを継承する。例えば、すべての型はToString()メソッドをもつ。
  • C#にはブール型boolが存在する。whileifのように条件をとるステートメントには、bool型の式を与えなければならない。CやC++にもブール型が存在するが、これは整数型と相互に変換可能で、while文やif文に与える式として整数やポインタも許容していた。C#ではミスを防止するために、このブール型と整数が可換であるという仕様を禁止している。
  • ポインタをサポートする。ポインタはunsafeスコープ内のみで使用することができ、適切な権限をもつプログラムのみがunsafeとマークされたコードを実行することができる。オブジェクトへのアクセスの大部分は管理された安全な参照によってなされ、大部分の算術演算はオーバフローのチェックがなされる。unsafeポインタは値型や文字列を指すことができる。セーフコードでは、必ずしもそうする必要はないものの、IntPtr型を通してポインタをやりとりすることができる。
  • マネージドなメモリを明示的に解放する方法は存在せず、参照されなくなったメモリはガベージコレクタによって自動的に解放される。ガベージコレクタは、メモリの解放忘れによって起こるメモリリークを解消する。C#は、データベース接続のようなアンマネージドなリソースに対しても明示的に制御する方法を提供している。これはIDisposableインタフェースとusingステートメントによってなされる。
  • クラスは複数のインタフェースを実装することができるが、多重継承はサポートされない。
  • C#C++に比べて型安全である。既定の暗黙変換は、整数の範囲を広げる変換や、派生クラスから基底クラスへの変換といった、安全な変換のみに限定される。これは、コンパイル時、JITコンパイル時、そして一部の動的なケースでは実行時に強制される。ブール型と整数型、列挙型と整数型、の間は暗黙変換はできない。暗黙変換をユーザ定義する際は、明示的にそのように指定しなければならない。これはC++コンストラクタとは違った仕様である。
  • 列挙型のメンバは、列挙型の名前空間の中におかれる。また、列挙型の定数名を取得することができる。さらに、列挙型の定数名から動的に定数値を得ることができる。
  • プロパティと呼ばれるアクセサは、C++におけるメンバフィールドのような構文でオブジェクトにアクセスすることができる。C++では、publicとしてメンバを宣言することでメンバを読むことも変更することもできるようになるが、C#ではプロパティによってメンバアクセスやデータの正当性チェックを制御することができる。
  • switch文で、基本型のみならず、定数文字列によって分岐することができる。

ソフトマター

ソフトマター

ソフトマター(Soft matter)とは、高分子液晶コロイドエマルション 例:乳液、乳剤、ゾルなど)、生体膜、生体分子(蛋白質DNAなど)などの柔らかい物質の総称。ソフトマテリアル(Soft material)とも言う。これらの物質では、当該物質を構成する単位が複雑な形、構造を持ち、その内部自由度も大きいことが特徴として挙げられる。ソフトマターを扱う物性物理学ソフトマター物理学と呼ぶ

f:id:kotaro920oka:20150615193030p:plain

特徴

ソフトマター高分子液晶コロイド界面活性剤など様々な物質を指すが、ソフトマターの構成単位は巨大分子または分子の大きな集合であることを共通とする。このような巨大分子または分子の大きな集合では固体結晶で見られるような3次元の長距離的秩序がないが、液体と同程度の局所的な秩序は必ず存在する。そのスケールは数ナノメートルから数百ナノメートル程度のメゾスコピックな領域である。

ソフトマターはその名の通り「やわらかい物質」であるが、運動エネルギーの観点からみて「やわらかい」、「固い」という性質は、大雑把にいうと前者が分子運動エネルギーk_BTに近く、後者がk_BTよりもはるかに小さいと特徴づけることができる。つまり、外部刺激にたいして大きな内部自由度をもちゆっくりとした応答を示す。

ソフトマターの大きな特徴のひとつに力学的振舞いが変形の速度に依存することがあげられる。すなわち、ソフトマターのほとんどは、変形の速度が小さいと流動的に振舞うのに対し、変形の速度が大きいと弾性的に振舞うのである(粘弾性)。具体的な例を挙げると、皿にのったゼリーを指でそっと触れば、ゼリーから反発力を感じる。このとき、指を離せばゼリーはもとの形に戻る(弾性)。しかし、強く指を押し付けると、指はゼリーにつきささり、指を離してもゼリーの形は元に戻らない(粘性)。

由来

ソフトマター」ということばが使われる以前からコロイド高分子液晶を対象とした研究が盛んであったが、これらを統一する概念としてソフトマターという言葉が生まれた。この「ソフトマター」という言葉がいつから用いられるようになったかは正確にはわからないが、少なくとも1992年には、ノーベル物理学賞受賞者であるピエール=ジル・ド・ジェンヌによって、この言葉が用いられている。ド・ジェンヌはノーベル賞受賞の際に「ソフトマター」というタイトルの受賞講演を行い、これにより「ソフトマター」という言葉が広がり、定着していった。

素粒子の分類

素粒子の分類

素粒子には、以下のように分類されます。

ボソン(ボース統計に従う粒子)

ゲージ粒子
素粒子間の相互作用(力)を伝え運ぶ粒子。それぞれの相互作用に応じて以下の種類がある。
ヒッグス粒子
素粒子質量を与える。

フェルミオンフェルミ統計に従う粒子)

フェルミオン
物質を構成する粒子。クォークレプトンに大きく分けられる。更にそれぞれが二系列に分けられ、三世代ずつの計6種類が発見されている。傾向として、世代数が大きいほど質量が大きいとされている。