< September 2008 | October 2008 | November 2008 >

October 29, 2008

'IValueConverter' 型にはパブリック TypeConverter クラスがありません。

Converting a collection to comma seperated list : Windows Presentation Foundation (WPF) : .NET Development : MSDN Forums の翻訳。せっかく訳したけど、私の現象とは関係なかったんだけどー。

一応断っておきますが、訳の内容はあんまり信用しないで。

続きを読む...

October 28, 2008

ネットワーク情報をいろいろ取得するやつ。

作ってからだいぶたつんですが、Windows 上のネットワーク環境の情報を.NET Framework を使用してごちゃごちゃ取ってきてどばっと表示するものです。こうやって見ると、Framework の階層構造がややこしいことがよくわかりますね。

続きを読む...

October 23, 2008

別アセンブリ内のリソースを参照する

XAML 内で、参照設定を行った別アセンブリ内の ResourceDictionary を使用する場合の記述方法です。

<ResourceDictionary Source="/ReferencedAssembly;component/ResourceFilePath"/>
ReferencedAssembly
参照アセンブリの短い名前を記述します。
ResourceFilePath
ResourceDictionary の XAML ファイルのパスです。拡張子(.xaml)も含めて記述します。また、ファイルがサブフォルダに格納されている場合は、パス情報も含めて記述します。

下記の例は、参照設定を行ったアセンブリ MyLibrary の、Themes ディレクトリ配下にある Resources.xaml を Window.Resources 要素内より参照する例です。

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/MyLibrary;component/Themes/Resources.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        
        <!-- この Window 内でリソースを定義する場合はこの辺りに… -->

参考:Windows Presentation Foundation におけるパッケージの URI

October 17, 2008

アプリケーションより実行ファイルのパスを得る

DLL なんかの場合や、別のプロセスからたたかれた場合等について未検証だけど、実行中のアプリケーションよりエントリポイントのあるモジュールへのパスを取得する方法。

var assembly = System.Reflection.Assembly.GetEntryAssembly ();
string appPath = assembly.Location;

System.IO.Path クラス

System.IO.Path クラスで、SHLWAPI.DLL の Path… 関数群とおんなじ様な処理が出来るようです。多くは static として定義されているため、インスタンスを作ることは少なそうです。

October 14, 2008

メモ: ListBox や ListView の行番号

創造的プログラミングと粘土細工 | 【WPF】ListBoxやListViewの行番号を出力する。
// 親の ItemsControl を取得して…
var itemsControl = ItemsControl.ItemsControlFromItemContainer (item);
// そいつの中での Index を聞く!
var index = itemsControl.ItemContainerGenerator.IndexFromContainer (item);

October 10, 2008

メモ:自身の IP アドレスを取得する方法

Winsock での方法は、Winsock Programmer's FAQ: Winsock 中級者向けの議論 にありあり。

3.3 - Winsock プログラム で自分の IP アドレスを取得する方法は?

3種類の方法があり、それぞれに利点、欠点があります:

  1. 最も簡単な方法は、connect 済みのソケットに対して getsockname() を呼び出すことです。connect 済みのソケットが無ければ、その呼出しは失敗するか、あるいは無意味な情報が返されます。
  2. ソケットを事前にオープンすることなしに自分のアドレスを取得するには、gethostname() の返却値に対して gethostbyname() を呼び出すことです。この例に示すように、この呼出しはそのホストが持つ全てのインターフェースのリストを返却します。 (この方式の問題点については、例のページを参照のこと。)
  3. 三番目の方法は Winsock 2 でのみ動作します。新しい WSAIoctl() API は SIO_GET_INTERFACE_LIST オプションをサポートしており、返却される情報の一部として、システムの各々のネットワークインターフェースのアドレスが返却されます。[C++ の例] (これも、注意点については例のページを参照のこと。)

後者二つの方式では、多くの TCP/IP ネットワークのマシンでは少なくとも二つのアドレスが返却されます。一つは「普通の」ネットワークインターフェースで、一つは「ループバック」ネットワークインターフェースになるはずです。通常、「普通の」ネットワークインターフェースはモデムかイーサネットカードです。ループバックインターフェース (IPアドレス 127.0.0.1)は、同一のマシン上で動作する二つのプログラムが、オペレーティングシステムのネットワークハードウェアレイヤを通過することなしに通信できるようにさせるものです。ループバックインターフェースを使用した通信は少なくとも普通のネットワークインターフェースと同じ程度の速度であり、ネットワークスタックによってははるかに高速になります。

一つのシステム上に二つ以上のネットワークインターフェースを持つこともあり得ます。多くのサーバでは、例えば二つ以上のネットワークインターフェースカードを持っていると、上記2番目、3番目の方法では4つ以上のエントリーが表示されます。さらに複雑な例はサテライト型インターネットルータで、これにはインターネットへの上流接続を行うモデムコネクション、インターネットからの下流接続を行うサテライトアダプタ、その他の LAN を通信するイーサネットカード、そしてもちろんループバックインターフェースが繋がっています。

もし同じマシン上で動作しているサーバとソケットを使って通信したいのであれば、ループバックインターフェースを使ってください。そうでなければ、普通のインターフェースのうちの一つを、頭をフル回転させて選ばなくてはなりません。全ての目的で使える決まりきった方法はありません。ほとんどのプログラムにおいては、実際にコネクションが使っている IP アドレスが返却されるので、上記の1の方法で十分です。もしこれが使えないのであれば、インターフェースにリストを表示して、ユーザに一つを選ばせる必要があるかもしれません。

PPPインターフェースのアドレスを知りたい、というときのように、より詳細な条件がある場合があります。この場合には上記の 3 の方式が使えます。これによって得られる情報の中には、PPP インターフェースのフラグが含まれるので、これで「ポイントto ポイント」インターフェースかどうかを知ることができるのです。

でも、私が今知りたいのは、C#、つまり .NET Framework を使った方法…。

---------
2008.10.28 追記
System.Net.NetworkInformation.IPInterfaceProperties.UnicastAddresses が、Iphlpapi.dll の GetAdaptersAddresses 関数で取得できるものと同等かも。

October 6, 2008

Enum と RadioButton をバインドする

bindenum.png

よくある感じのネタで恐縮ですがー。

RadioButton といえばやはり Enum。コンバータを使用して、こんな感じでバインドします。

<!-- Window1.xaml -->
<Window x:Class="ConverterTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:ConverterTest"
    Title="RadioButton と Enum をバインドする">
    <Window.Resources>
        <!-- コンバータ -->
        <local:EnumRadioConverter x:Key="enumRadioConverter"/>
    </Window.Resources>

    <StackPanel>
        <Button x:Name="ButtonTarget" Margin="5" >穴があったら入りたい…。</Button>
        <RadioButton IsChecked="{Binding ElementName=ButtonTarget, Path=Visibility, Converter={StaticResource enumRadioConverter}, ConverterParameter=Visible}" Margin="5" GroupName="ButtonVisibility">白日の下に曝す</RadioButton>
        <RadioButton IsChecked="{Binding ElementName=ButtonTarget, Path=Visibility, Converter={StaticResource enumRadioConverter}, ConverterParameter=Hidden}"  Margin="5" GroupName="ButtonVisibility">隠してあげる</RadioButton>
    </StackPanel>
</Window>

コンバータのソースです。

public class EnumRadioConverter : System.Windows.Data.IValueConverter
{
    // Enum → bool
    public object Convert (object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // バインドする列挙値の文字列表記がパラメータに渡されているか
        var paramString = parameter as string;
        if (paramString == null)
        {
            return System.Windows.DependencyProperty.UnsetValue;
        }

        // パラメータが Enum の値として正しいか
        if (!Enum.IsDefined (value.GetType (), paramString))
        {
            return System.Windows.DependencyProperty.UnsetValue;
        }

        // パラメータを Enum に変換
        var paramParsed = Enum.Parse (value.GetType (), paramString);

        // 値が一致すれば true を返す
        return (value.Equals (paramParsed));
    }

    // bool → Enum
    public object ConvertBack (object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // バインドする列挙値の文字列表記がパラメータに渡されているか
        var paramString = parameter as string;
        if (paramString == null)
        {
            return System.Windows.DependencyProperty.UnsetValue;
        }
        
        // チェックが入っているか (この評価は不要?)
        var isChecked = (bool) value;
        if (!isChecked)
        {
            return System.Windows.DependencyProperty.UnsetValue;
        }

        // 列挙型にパースして返す
        return Enum.Parse (targetType, paramString);
    }
}

October 2, 2008

IPv6 マルチキャストアドレスの覚え書き

http://www.csl.sony.co.jp/cgi-bin/hyperrfc?rfc2373
8bit4bit4bit112bit
11111111 00PT XXXX group ID
flagsscope
ビット 意味 説明
11 P prefix-bit ネットワークプレフィックス埋込型アドレス
12 T 0 well-known 恒久的なマルチキャストアドレス
1 transient 一時的なマルチキャストアドレス
13 XXXX 0000(0) reserved
0001(1) interface-local scope
0010(2) link-local scope
0011(3) reserved
0100(4) admin-local scope
0101(5) site-local scope
1000(8) organization-local scope
1110(E) global scope
1111(F) reserved