2012年4月29日日曜日

wpf : カスタムコントロールを追加するもう1つの方法

普通、カスタムコントロールを作成するときはソリューションエクスプローラーから新しい項目を追加しますよね? その方法で追加すると「Themes/Generic.xaml」と「カスタムコントロール名.cs」のファイルが追加されます。 これを編集していくのが普通のやり方です。

ですが、コレだとやりたい事ができないケースもあるようです。 今回は、Generic.xamlのStyleにEventSetterを追加したらx:Classが無いとダメだと怒られてしまいました。 それをキッカケに「x:Classの設定ってどう書くの?」と色々検索して試してみたらカスタムコントロールを追加するもう1つの方法が見つかりました。 この方法なら問題なくEventSetterも使えます。

その方法はこんな感じ。

2012年4月28日土曜日

wpf : 添付ビヘイビアでTextBoxにフォーカスが移った時全選択にするプロパティを作成

タイトルどおりのものを作りました。 リソースのスタイルに書いておけばいっぺんに適用できます。 アプリケーション全体で使うリソースディクショナリとかを用意しておけば楽。

2012年4月25日水曜日

wpf : msdnのExpanderテンプレートのサンプルにあるDesiredHeightとは何者か?

Expanderのカスタムコントロールを作りたくて検索してみたら次のページが見つかりました。

これを元にシンプルなカスタムExpanderを作るとこうなります。 Themes/Generic.xamlは、

2012年4月22日日曜日

C# : 動作中のプロセスのコマンドライン引数を一覧表示

VBでコレをやる方法は検索で見つかりました。

C#でのやり方が書いてなかったので書き換えてみました。 System.Managementの参照を追加して、

2012年4月19日木曜日

wpf : 色選択コントロールを作成

wpfには色選択ダイアログがないようです。 参照を追加してwpfじゃない方の色選択ダイアログ(System.Windows.Forms.ColorDialog)を使えばいいのかもしれませんが、ちょっと欲しいのと違ったので自作してみました。

2012年4月18日水曜日

wpf : ListBoxItemが右クリックで選択されないようにする

ちょっとだけ特殊な用途ですが、ListBoxItemにContextMenuを登録して、左クリックで選択の変更、右クリックでは選択を変更せずにContextMenuを表示という振る舞いにしたくなりました。 ListBox.ItemTemplateでMouseRightButtonDownイベントを登録し、握りつぶすだけで実現できました。

<Window x:Class="ListBoxItemEventTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ListBoxItemEventTest" Height="128" Width="256">
    <Window.Resources>
        <ContextMenu x:Key="contextMenu">
            <MenuItem Header="テストメニュー" Click="OnMenuItemClick"/>
        </ContextMenu>
    </Window.Resources>
    <ListBox Name="listBox">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Label
                        Content="{Binding}"
                        ContextMenu="{DynamicResource contextMenu}"
                        MouseRightButtonDown="OnListBoxMouseRightButtonDown"
                />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>

2012年4月16日月曜日

wpf : ユーザーコントロールでDataContextを使うときの定石

wpfで独自のコントロールを作るには3通りのやり方があります。

  • カスタムコントロール ... 既存のコントロールを改造(継承)する。
  • ユーザーコントロール ... 複数の既存のコントロールを組み合わせて作る。
  • 自作 ... Controlクラスを継承して1から作る。

今回はユーザーコントロールについてのお話。

ユーザーコントロールでDataContextを使うとき、

public partial class TestControl : UserControl
{
    public TestControl()
    {
        InitializeComponent();

        this.DataContext = new TestData();
    }
}

というようにthis.DataContextにインスタンスを設定してはいけません。 ユーザーコントロールを使う側にDataContextを変更されると挙動が変わってしまいます。

上に書いたとおり、ユーザーコントロールは複数のコントロールを組み合わせて作ります。 そのため必ずGridやStackPanelのようなコンテナとなるコントロールが含まれます。

2012年4月8日日曜日

wpf : スライダーとスピナー付きの整数しか入力できないTextBox

UserControlを継承してスライダーとスピナー付きの整数しか入力できないTextBoxを作りました。

とりあえずNumericBoxというクラス名にしました。 スライダーが付いている時点でBoxではないような気もしますが、名前を考えるのが面倒だったのでそんな感じで。 勢いで作ってちょっとだけ動作チェックして勢いで公開です。 そんな品質です。

まずはコードを載せます。 NumericBox.xamlから。

2012年4月6日金曜日

wpf : ValidationRuleをC#のコードから追加

TextBoxなどの入力値検証でValidationRuleを継承したクラスを作ることが多いですよね。 たいていの場合はxamlで追加します。

<TextBox>
    <TextBox.Text>
        <Binding>
            <Binding.ValidationRules>
                <local:なんたらValidationRule/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

xamlでValidationRuleを追加するコードを書いた場合、自作ValidationRuleはどこかで勝手にインスタンス化されます。 このインスタンスにアクセスできれば、次のようなことが可能になります。

  • 検証の閾値を動的に設定。
  • 他のクラスに持たせた値を検証に使用。