'IValueConverter' 型にはパブリック TypeConverter クラスがありません。
Converting a collection to comma seperated list : Windows Presentation Foundation (WPF) : .NET Development : MSDN Forums の翻訳。せっかく訳したけど、私の現象とは関係なかったんだけどー。
一応断っておきますが、訳の内容はあんまり信用しないで。
Converting a collection to comma seperated list : Windows Presentation Foundation (WPF) : .NET Development : MSDN Forums の翻訳。せっかく訳したけど、私の現象とは関係なかったんだけどー。
一応断っておきますが、訳の内容はあんまり信用しないで。
XAML 内で、参照設定を行った別アセンブリ内の ResourceDictionary を使用する場合の記述方法です。
<ResourceDictionary Source="/ReferencedAssembly;component/ResourceFilePath"/>
下記の例は、参照設定を行ったアセンブリ MyLibrary の、Themes ディレクトリ配下にある Resources.xaml を Window.Resources 要素内より参照する例です。
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyLibrary;component/Themes/Resources.xaml"/>
</ResourceDictionary.MergedDictionaries>
<!-- この Window 内でリソースを定義する場合はこの辺りに… -->
DLL なんかの場合や、別のプロセスからたたかれた場合等について未検証だけど、実行中のアプリケーションよりエントリポイントのあるモジュールへのパスを取得する方法。
var assembly = System.Reflection.Assembly.GetEntryAssembly (); string appPath = assembly.Location;
System.IO.Path クラスで、SHLWAPI.DLL の Path… 関数群とおんなじ様な処理が出来るようです。多くは static として定義されているため、インスタンスを作ることは少なそうです。
// 親の ItemsControl を取得して… var itemsControl = ItemsControl.ItemsControlFromItemContainer (item); // そいつの中での Index を聞く! var index = itemsControl.ItemContainerGenerator.IndexFromContainer (item);
でも、私が今知りたいのは、C#、つまり .NET Framework を使った方法…。3.3 - Winsock プログラム で自分の IP アドレスを取得する方法は?
3種類の方法があり、それぞれに利点、欠点があります:
- 最も簡単な方法は、connect 済みのソケットに対して getsockname() を呼び出すことです。connect 済みのソケットが無ければ、その呼出しは失敗するか、あるいは無意味な情報が返されます。
- ソケットを事前にオープンすることなしに自分のアドレスを取得するには、gethostname() の返却値に対して gethostbyname() を呼び出すことです。この例に示すように、この呼出しはそのホストが持つ全てのインターフェースのリストを返却します。 (この方式の問題点については、例のページを参照のこと。)
- 三番目の方法は 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 ポイント」インターフェースかどうかを知ることができるのです。
---------
2008.10.28 追記
System.Net.NetworkInformation.IPInterfaceProperties.UnicastAddresses が、Iphlpapi.dll の GetAdaptersAddresses 関数で取得できるものと同等かも。
よくある感じのネタで恐縮ですがー。
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); } }
| 8bit | 4bit | 4bit | 112bit |
| 11111111 | 00PT | XXXX | group ID |
| flags | scope |
| ビット | 値 | 意味 | 説明 | |
|---|---|---|---|---|
| 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 | |||