約 1,571,690 件
https://w.atwiki.jp/atachi/pages/52.html
依存関係プロパティの基本実装 [#xa682a33] 依存関係プロパティの識別子を実装 [#i7e417dd] FrameworkPropertyMetadataで指定するメタデータについて [#a3e9a582] コレクションの依存関係プロパティ [#a4489562] 参考サイト コントロールを自作する場合に、コントロールが公開するプロパティは依存関係プロパティとして実装します。 依存関係プロパティとして実装すると、バインディングが使えるようになります。 リソース データ バインディング スタイル Animations メタデータのオーバーライド プロパティ値の継承 WPF デザイナーの統合 依存関係プロパティの基本実装 依存関係プロパティは次のようにDependencyPropertyを使用して値を管理します。 値の取得や設定はすべてGetValueメソッド/SetValueメソッドで行われます。 コントロールを使う側は、公開されているプロパティである依存関係プロパティだけしか見えません。 class MyCustomControl Control { // 依存関係プロパティの識別子 public static readonly DependencyProperty IsSpinningProperty = DependencyProperty.Register( "IsSpinning", // name 引数 typeof(Boolean), // propertyType 引数 typeof(MyCustomControl), // ownerType 引数 ); // 依存関係プロパティ public bool IsSpinning { get { return (bool)GetValue(IsSpinningProperty); } set { SetValue(IsSpinningProperty, value); } } } 依存関係プロパティの識別子を実装 DependencyProperty.Register()を使用して、 WPFが持つプロパティシステムにプロパティに関する情報を登録します。 引数名 設定内容例 説明 name "IsSpinning" プロパティシステムに登録するプロパティ名。 propertyType typeof(Boolean) プロパティの型情報。typeofを使って型情報を取り出す。 ownerType typeof(MyCustomControl) プロパティを定義したクラスの型情報。 typeMetadata new FrameworkPropertyMetadata(...) プロパティについての追加情報。FrameworkPropertyMetadata を使って指定する。省略可能。こちら validateValueCallback new ValidateValueCallback(...) プロパティの値についてのバリデーション。ValidateValueCallback を使って指定する。省略可能。 Registerの戻り値には依存関係プロパティに関する情報が含まれている。 依存関係プロパティに値を設定する場合や取得する場合はこのインスタンスをつかって行う。 このインスタンスは、public static readonlyで定義する必要がある。 FrameworkPropertyMetadataで指定するメタデータについて FrameworkPropertyMetadata を使用すると、プロパティに関する設定が行える。 プロパティの初期値 プロパティ変更時に呼び出されるコールバックメソッド WPFデザイナによるデザイン時の挙動 デフォルトのデータバインディングのモード VisualObjectツリーで親から子へのプロパティ継承 WPFデザイナに関係するプロパティがいくつかあります。 適切に設定することで、WPFデザイナ使用時のパフォーマンスがよくなります。 AffectsMeasureプロパティ値の変更時に、サイズ変更を伴うコントロールの再描画が必要。 AffectsArrangeプロパティ値の変更時に、サイズ変更を伴わない(自分より下階層のサイズ変更は許可)コントロールの再描画が必要。 AffectsRenderプロパティ値の変更時に、一切のサイズ変更が伴われないコントロールの再描画が必要。 コレクションの依存関係プロパティ カスタムコントロールのコンストラクタでSetValueを使ってsingletonなコレクション型インスタンスを作成する 依存関係プロパティ識別子は読み取り専用で登録する(DependencyProperty.RegisterReadOnly を使用する) class MyCustomControl Control { public MyCustomControl() base() { SetValue(ItemsPropertyKey, new List FrameworkElement () ); } private static readonly DependencyPropertyKey ItemsPropertyKey = DependencyProperty.RegisterReadOnly( "Items", typeof(List FrameworkElement ), typeof(MyCustomControl), new FrameworkPropertyMetadata(new List FrameworkElement ()) ); // 依存関係プロパティの識別子 public static readonly DependencyProperty IsSpinningProperty = DependencyProperty.Register( "IsSpinning", // name 引数 typeof(Boolean), // propertyType 引数 typeof(MyCustomControl), // ownerType 引数 ); public static readonly DependencyProperty ItemsProperty = ItemsPropertyKey.DependencyProperty; // 依存関係プロパティ public bool IsSpinning { get { return (bool)GetValue(IsSpinningProperty); } set { SetValue(IsSpinningProperty, value); } } public List FrameworkElement Items { get { return (List FrameworkElement )GetValue(ItemsProperty); } } } 参考サイト MSDN カスタム依存関係プロパティ
https://w.atwiki.jp/ryouga0415/pages/85.html
更新日:2010-06-02 今回のサンプルプログラムの構造 ソリューション |- MixAutoList … リスト画面1用プロジェクト |- AutoList.xaml |- MixAutoListTest … MixAutoListのNUnitテストプロジェクト |- MixAutoListTest.cs |- MixList … リスト画面2用プロジェクト |- List.xaml |- MixListTest … MixListのNUnitテストプロジェクト |- MixListTest.cs |- MixRaku … メイン画面用プロジェクト |- Raku.xaml |- MixRakuTest … MixRakuのNUnitテストプロジェクト |- MixRakuTest.cs |- MixUser … ユーザ情報登録画面用プロジェクト |- MixUser.xaml |- MixUserTest … MixUserのNUnitテストプロジェクト |- MixUserTest.cs 各プロジェクト単位でUI画面が発生するため、1つのプロジェクトに対して1つのNUnit用プロジェクトを作成する。 Testプロジェクトは、クラスライブラリで作成、UI系プロジェクトは、WPFプロジェクトで作成する。 Blendを起動し、画面をデザインする。 各コントロールの背景色も設定でき、リアルタイムにXAML(ザムル)ビューアで確認ができる。 NUnitプロジェクトは、以下を参照設定に追加する必要があります。nunit.framework UIAutomationClient UIAutomationTypes NUnit用のテストプロジェクトを読み込み、RUNで実行する。 ※予め、NUnitをインストールする必要があります。
https://w.atwiki.jp/fumiduki1985/pages/341.html
WPFアプリケーションのエントリーポイントとなるMain()関数は、App.xaml(デフォルトの名前。変更した場合はこれに限らない。)をビルドした際に自動実装され、普段プログラマが実装することはない。 しかし、Main関数を自前で実装したい場合は、App.xamlのプロパティで「ビルドアクション」を「Page」に変更すればよい。 こうすることで、Main関数が自動実装されなくなり、独自のMain関数を実装可能になる。 このページのタグ一覧 C# WPF プログラミング 最終更新日:2018/02/06
https://w.atwiki.jp/atachi/pages/31.html
スタイルの使用方法 [#a5912b9b] 特定の要素にスタイルを適応 [#u3f765b2] スタイルを継承 [#f923f2e2] テンプレート [#c1ac1a97] データテンプレート [#v289532d] データテンプレートをクラスに適応させる [#x6c68de8] テンプレート内にリソースを適応させる [#e9d96c52] DataTemplateとバインドソース [#o6d284ae] コントロールテンプレート [#j961ba65] トリガー [#pb4f2efd] WPFのスタイルは、スタイルという名前ですがデザインやカラー設定を行うためだけの機能ではありません。 スタイルを定義するにはStyle要素を使用します。Style要素内ではコンポーネントのプロパティ値の設定やデータのプロパティ値の設定ができます。 データテンプレートでは再利用可能なデータバインディングを持ったスタイルを定義します。 コントロールテンプレートでは既存のコントロールのUIデザインを定義できます。 スタイルの使用方法 スタイルはXAMLのResourcesに記述します。 Style.TargetType属性の指定し、XAMLデザイナがSetter要素のPropertyの値を検証するためにも使用します。 Setter要素の値はValue属性に記述することもできますし、次のようにプロパティ要素として記述することもできます。 Setter Property="PropertyA" Setter.Value プロパティ要素 /Setter.Value /Setter 次のコードはXAML内のすべてのTextBlock要素にスタイルが適応されます。 Window.Resources Style TargetType="TextBlock" Setter Property="HorizontalAlignment" Value="Center" / Setter Property="FontSize" Value="14" / Setter Property="FontFamily" Setter.Value Comic Sans MS /Setter.Value /Setter /Style /Window.Resources Grid TextBlock Text="ようこそ。" / TextBlock Text="今日は12月8日です。" / /Grid スタイルだけを先に定義し、各VisualObjectからスタイルを参照したい場合、Style.TargetStyle属性を使用せずにx Key属性を使ってスタイルの定義だけを行います。 Window.Resources Style x Key="MyStyle" Setter Property="TextBlock.HorizontalAlignment" Value="Center" / Setter Property="TextBlock.FontSize" Value="14" / Setter Property="TextBlock.FontFamily" Value="Comic Sans MS" / /Style /Window.Resources 特定の要素にスタイルを適応 Style要素の定義時にx Key要素でスタイルに名前をつけた場合、スタイルが適応されるには明示的にスタイル名を指定する必要があります。 次の例では2つのTextBlockのうち、1番目のTextBlockだけにスタイルが適応されます。 Window.Resources Style x Key="MyStyle" TargetType="TextBlock" Setter Property="HorizontalAlignment" Value="Center" / Setter Property="FontSize" Value="14" / Setter Property="FontFamily" Value="Comic Sans MS" / /Style /Window.Resources Grid TextBlock Text="ようこそ。" Style="{StaticResource MyStyle}" / TextBlock Text="今日は12月8日です。" / /Grid スタイルを継承 Style.BaseOn属性を使用してスタイルを継承し、そこから設定済みプロパティの再設定やプロパティの追加が行えます。 Window.Resources Style TargetType="TextBlock" Setter Property="FontSize" Value="20"/ /Style Style x Key="MyColorStyle" TargetType="TextBlock" BasedOn="{StaticResource {x Type TextBlock} }" Setter Property="Foreground" Value="#FFC13B3B" / /Style /Window.Resources Grid StackPanel Height="100" HorizontalAlignment="Left" Name="stackPanel1" VerticalAlignment="Top" Width="200" TextBlock Height="23" Name="textBlock2" Text="TextBlock" / TextBlock Height="70" Name="textBlock1" Text="よだー" Style="{StaticResource MyColorStyle}"/ /StackPanel /Grid MyColorStyleは既存のTextBlockのスタイルを継承しています。 テンプレート データテンプレート コントロールテンプレート それぞれUIの描画スタイルを設定する手法で、再利用可能なことからテンプレートと呼ばれている。 データテンプレートとは主にコレクションをアイテムとして表示するコントロール(ListBox、ListView、TreeView、DataGrid、その他)で、そのアイテムを描画するためのUIを定義したものです。 コントロールテンプレートとはUIの描画そのものを再定義するものです。Buttonコントロールは1つのコントロールに見えますが内部ではGridやTextBlockを組み合わせて1つのコントロールとして描画しています。 データテンプレート VisualObjectを持つスタイルをデータテンプレートと呼びます。 データテンプレートではデータを表示する為のオブジェクト要素構造をテンプレート化し、UIデザインとデータの両方の再利用を実現できます。 テンプレート化したオブジェクト要素構造は、バインディングによって動的に表示内容を変更するように設計します。 次のサンプルでは、ListBoxに設定したデータソースの要素を描画する際に、各要素を描画するためのテンプレートを定義しています。 ListBox Width="400" Margin="10" ItemsSource="{Binding Source={StaticResource myTodoList} }" ListBox.ItemTemplate DataTemplate StackPanel TextBlock Text="{Binding Path=TaskName}" / TextBlock Text="{Binding Path=Description}"/ TextBlock Text="{Binding Path=Priority}"/ /StackPanel /DataTemplate /ListBox.ItemTemplate /ListBox データテンプレートはリソースとして定義できます。次のように予めリソースとして定義しておきx Key属性で指定した名前を定義しておけば、データテンプレートの再利用が可能です。 ListBox.ItemTemplateへはStaticResourceを使用してリソースを呼び出します。 Window xmlns local="clr-namespace my" Window.Resources ObjectDataProvider x Key="myTodoList" ObjectType="{x Type local Tasks}"/ DataTemplate x Key="myTemplate" StackPanel TextBlock Text="{Binding Path=TaskName}" / TextBlock Text="{Binding Path=Description}"/ TextBlock Text="{Binding Path=Priority}"/ /StackPanel /DataTemplate /Window.Resources !-- リソースに定義した「myTemplate」をデータテンプレートに使用する -- ListBox Width="400" Margin="10" ItemsSource="{Binding Source={StaticResource myTodoList} }" ItemTemplate="{StaticResource myTemplate" / /Window namespace my { public class Tasks ObservableCollection Task { public Tasks() { this.Add(new Task{TaskName="テレビを見る", Description="水戸黄門", Priority=3}); this.Add(new Task{TaskName="電話", Description="佐藤さんに電話", Priority=10}); this.Add(new Task{TaskName="勉強", Description="C#の勉強に明け暮れる", Priority=5}); } } public class Task { public string TaskName { get; set; } puiblic string Description { get; set; } public int Priority { get; set; } } } データテンプレートをクラスに適応させる DataTemplate.DateType を使用すると特定のオブジェクトすべてにデータテンプレートを適用することができます。 この仕組みは 非常に重要 で、任意のC#コードで記述されたクラスに対してXAMLによるUIのデザインを設定できます。 次のサンプルではListBox.ItemTemplateへデータテンプレートの設定を行っていません。しかし、正常に動作します。 これはListBoxがTaskオブジェクトを表示する際に、DataTemplateによって設定されたデータテンプレートが使用されている為です。 Window xmlns local="clr-namespace my" Window.Resources ObjectDataProvider x Key="myTodoList" ObjectType="{x Type local Tasks}"/ DataTemplate DataType="{x Type local Task}" StackPanel TextBlock Text="{Binding Path=TaskName}" / TextBlock Text="{Binding Path=Description}"/ TextBlock Text="{Binding Path=Priority}"/ /StackPanel /DataTemplate /Window.Resources ListBox Width="400" Margin="10" ItemsSource="{Binding Source={StaticResource myTodoList} }" / /Window テンプレート内にリソースを適応させる ComboBoxなどアイテムソースを受け取るコントロールでは、表示させるアイテムをItemsSourceプロパティなどに設定します。 通常はItemsSourceプロパティにはバインディングやリソースを行って項目を指定します。 しかし、データテンプレート内でバインディングを指定する場合には注意が必要です。 バインディングを使用する場合、バインドソースはデータテンプレートに与えられたアイテムになります。(ItemsSourceに設定されたコレクションの各要素がバインドソースとなる) データテンプレート内ですべてのComboBoxに同じ選択肢を表示したい場合には StaticResourceマークアップ拡張 を使用します。 Window.Resources src MyList x Key="myList" / col ArrayList x Key="MyDataSource" sys DateTime 1/2/2003 5 00 00 /sys DateTime sys DateTime 4/5/2006 13 13 13 /sys DateTime sys DateTime 7/8/2009 23 59 59 /sys DateTime /col ArrayList /Window.Resources Grid ListView ItemsSource="{StaticResource MyDataSource}" ListView.View GridView GridViewColumn Header="月" DisplayMemberBinding="{Binding Month}" / GridViewColumn Header="日" DisplayMemberBinding="{Binding Day}" / GridViewColumn Header="日付" DisplayMemberBinding="{Binding DayOfWeek}"/ GridViewColumn GridViewColumn.Header TextBlock Text="何か選択" / /GridViewColumn.Header GridViewColumn.CellTemplate DataTemplate ComboBox Name="comboBox1" Width="100" ItemsSource="{StaticResource ResourceKey=myList}" / /DataTemplate /GridViewColumn.CellTemplate /GridView /ListView.View /ListView /Grid class MyList List string { public MyList() { this.Add("日本"); this.Add("韓国"); this.Add("北朝鮮"); this.Add("中国"); this.Add("台湾"); this.Add("フィリピン"); this.Add("タイ"); this.Add("ベトナム"); } } DataTemplateとバインドソース ContentPresenter Name="stp1" Content="WPFは複雑" Grid.Row="1" Grid.Column="1" Height="22" Margin="9,0,0,0" ContentPresenter.ContentTemplate DataTemplate TextBlock Text="{Binding}" / /DataTemplate /ContentPresenter.ContentTemplate /ContentPresenter 親要素のContentが参照される この例では、TextBlockは「WPFは複雑」と表示されます。 理由は純粋に、ContentプロパティがInhert属性のプロパティなので、ContentPresenterがテンプレートを使ってビジュアルツリーを構築する際に、TextBlock.ContentもContentPresenter.Contentを参照します。 コントロールテンプレート コントロールテンプレートではコントロールの構造と外観を定義します。 スタイルとしてコントロールテンプレートを適応することで、コントロールの構造や外観を再定義することができます。 コントロールテンプレートはControlクラスを継承した多くのコントロールに対して適応できます。 参考 MSDN コントロールテンプレートを適応するというのは、そのコントロールのビジュアルツリーを書き換えることを意味します。 ただし、コントロールのビジュアルツリーの一部だけを書き換えることはできません。 カスタムコントロールテンプレート例 タブ トリガー プロパティの値を判断し、動的に任意のプロパティ値を設定することができる。 if構文と違い、判断するデータソースや設定可能なデータソースは限られている。 データテンプレートで使用する場合は、そのデータがデータソースとなる。(ItemsSource属性を持つComboBoxやListBoxの場合、各要素をデータテンプレートを使って表示する際の各要素がデータソースとなる) よって、プログラマが自由なデータソースを指定し、その値を動的に評価して処理を分岐するといったif構文のような処理は行えない。
https://w.atwiki.jp/nina_a/pages/59.html
https://w.atwiki.jp/sevenlives/pages/1392.html
XAML?
https://w.atwiki.jp/atachi/pages/37.html
入力値のバリデーション 複数行の入力 入力文字列の検証に正規表現を使用する テキストボックスとIMEとの関係 入力値のバリデーション テキストボックスに入力されている値が正しい値であるかを判断し、正しくない場合にエラー表示を行います。 入力値のバリデーション 複数行の入力 AcceptsReturn属性をtrueにセットすると、ユーザーからのEnterキーの入力を受け付けるようになります。TextWrapping属性やVerticalScrollBarVisibility属性、HorizontalScrollBarVisibility属性との併用を検討します。 TextWrapping属性は文字列の自動改行を行うかどうかを設定するフラグです。 VerticalScrollBarVisibility属性・HorizontalScrollBarVisibility属性はテキストボックスのスクロールバーを表示するかしないかを指定するものです。 入力文字列の検証に正規表現を使用する CodeProjectにそれらしき記事の投稿がありました。 http //www.codeproject.com/KB/WPF/RegexValidationInWPF.aspx テキストボックスとIMEとの関係 WPFのTextBoxにはIMEとの関係で様々な問題が今でも残っています。 TextBox で添付ビヘイビアを使ったところ、IME と干渉するのか重大エラーが!IMEを使っている場合のみに発生するという厄介な問題。 IMEで変換状態中でもTextBox.TextChangedが発生するイベントの動作的には正しいが、例えばエンターキーやスペースキーの入力を検出したい場合に、それが変換中のEnterなのかそうでないのかをプログラマがロジックで判断しなければならない。
https://w.atwiki.jp/gotyagotya/pages/55.html
ゲームってかツールとか。自分用。 ミクさん喋るお トップページ
https://w.atwiki.jp/nina_a/pages/60.html
装飾レイヤー(Adorner Layer) このページを編集 装飾レイヤーとは 装飾対象であるエレメントやコレクションの前面に存在するレイヤーでAdornerを描画する層である.イメージとしては画面上のエレメントなどの上に透明のアクリル板があって,そのアクリル板に描画することで,画面上のエレメントを装飾するというもの. サンプル +テキストボックスの入力が数字以外であった場合にエラーを表示する XAML Window x Class="WpfSampleApplication.MainWindow" xmlns="http //schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns x="http //schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="400" Width="500" Grid x Name="LayoutRoot" Grid.RowDefinitions RowDefinition Height="*" / RowDefinition Height="*" / /Grid.RowDefinitions TextBox Width="200" Height="100" LostKeyboardFocus="OnKeyFocusLost_1"/ TextBox Width="200" Height="100" LostKeyboardFocus="OnKeyFocusLost_2" Grid.Row="1"/ /Grid /Window C# using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Globalization; namespace WpfSampleApplication { /// summary /// MainWindow.xaml の相互作用ロジック /// /summary public partial class MainWindow Window { public MainWindow() { InitializeComponent(); } Adorner adorner_1; private void OnKeyFocusLost_1(object s, RoutedEventArgs e) { var sender = s as TextBox; int output; // TryParseで失敗する場合にAdornerでエラーメッセージを表示する if(!int.TryParse(sender.Text, out output) ) { if(adorner_1 != null) { // senderの装飾レイヤを取得し,SampleAdornerを追加 var adornerLayer = AdornerLayer.GetAdornerLayer(sender); if ( adornerLayer != null ) { adorner_1 = new SampleAdorner(sender); adornerLayer.Add(adorner_1); } } } else if ( adorner_1 != null) { ((AdornerLayer)(adorner_1.Parent)).Remove(adorner_1); adorner_1 = null; } } Adorner adorner_2; private void OnKeyFocusLost_2(object s, RoutedEventArgs e) { var sender = s as TextBox; int output; if (!int.TryParse(sender.Text, out output)) { if (adorner_2 == null) { var adornerLayer = AdornerLayer.GetAdornerLayer(sender); if (adornerLayer != null) { adorner_2 = new SampleAdorner(sender); adornerLayer.Add(adorner_2); } } } else if( adorner_2 != null ) { ((AdornerLayer)(adorner_2.Parent)).Remove(adorner_2); adorner_2 = null; } } private class SampleAdorner Adorner { public SampleAdorner(UIElement adorned) base(adorned) { } protected override void OnRender(DrawingContext drawingContext) { var rect = new Rect(this.AdornedElement.DesiredSize); var text = new FormattedText( "数字以外は入力できません。", CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, new Typeface("メイリオ"), 20, Brushes.Red); var point = (Point) ( rect.TopLeft - new Point(0, text.Height) ); drawingContext.DrawText(text, point); } } } } カテゴリ:WPF aasasaw - aa 2011-07-13 13 16 41 ああ - あああ 2012-03-27 16 33 39 あああ - あああ 2012-03-27 16 33 58 aaa - aaa 2012-03-29 18 19 11 aaaaaaaaaaaaaaaaaa - aaaaaaaaaaaaaaa 2013-05-24 16 42 23 p - p 2014-06-12 13 30 36 r - r 2014-09-12 15 05 14 あdふぁ - あああ 2014-09-24 14 54 01 名前
https://w.atwiki.jp/atachi/pages/34.html
コンテナ コンテナクラス 説明 Grid コンテナを任意の数のグリッドに区切る。各グリッド内を境界としてコンポーネントを配置したり、複数のグリッドをまたぐこともできる。 StackPanel コンポーネントを任意の方向に向けて一列に並べる。「上下方向」か「左右方向」の指定はOrientation属性で指定する。表示はFlexのHBoxやVBoxのようになる(または、Directionを指定したBox)。 WrapPanel コンポーネントを左上から右下に向けて連続して並べる。並べる際の方向は左から右方向か、上から下方向で選択できる。 Canvas 座標を指定できるので、コンポーネントを自由な場所に配置できる。 マウスイベントの問題 DaDMgrはアプリケーションのルート要素が受け取っているPreviewDragOverイベントをハンドリングし、Adornerをマウスに追従させているのですが、背景色を設定しないコンテナにおいて、マウスイベントが発生しない問題があります。(WPFでは予てからのバグなのか仕様なのか・・・) ただし、この問題は簡単に回避可能で、Backgroundプロパティを設定すればよいだけです。 透過色も使用できます。 Window Grid Grid.Background SolidColorBrush / /Grid.Background /Grid /Window