トップページtech
1001コメント292KB

WPF(XAML, XBAP, .NET4.0)GUIプログラミング Part7

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/08/22(日) 21:11:53
一向に普及しないユーザーインターフェースシステム
Windows Presentation Frameworkについて語るスレ。
パワフルで柔軟すぎるのが敗因か? 正直ついていけないよね…。

Visual Studio 2010
ttp://www.microsoft.com/japan/msdn/vstudio/
Microsoft .NET Framework 4 (Web インストーラー)
http://www.microsoft.com/downloads/details.aspx?familyid=9CFB2D51-5FF4-4491-B0E5-B386F32C0992&displaylang=ja
Microsoft .NET Framework 4 (スタンドアロンインストーラー)
http://www.microsoft.com/downloads/details.aspx?familyid=0A391ABD-25C1-4FC0-919F-B21F31AB88B7&displaylang=ja

関連スレ
Microsoft Silverlight その6
ttp://pc12.2ch.net/test/read.cgi/tech/1271580489/

過去スレ
WPF(XAML, XBAP, .NET4.0)GUIプログラミング Part6
http://hibari.2ch.net/test/read.cgi/tech/1274423236/
WPF(XAML, XBAP, .Net3.5)GUIプログラミング Part5
http://pc12.2ch.net/test/read.cgi/tech/1261879110/
WPF(XAML,XBAP,.NET3.5)GUIプログラミング Part3
ttp://pc12.2ch.net/test/read.cgi/tech/1245384489/
WPF(XAML,XBAP,.NET3.5)GUIプログラミング Part3
ttp://pc12.2ch.net/test/read.cgi/tech/1231506876/
WPF(XAML,XBAP,.NET3.5)GUIプログラミング
ttp://pc11.2ch.net/test/read.cgi/tech/1211453941/
【新GUI FW】WPF(XAML,AVALON,.NET3.0)【重い?】
ttp://pc11.2ch.net/test/read.cgi/tech/1162950198/

コードを貼る場合は以下のサイトの利用をお勧め。
run codeのチェックは外しておきましょう。
http://ideone.com/
0552デフォルトの名無しさん2010/11/13(土) 18:02:06
デザイナが謎のぬるぽで、
でもエラー0で普通に起動できて普通に動いて・・・

って2時間悩んだ末、VS再起動したら直った。
ふざくんな!
0553デフォルトの名無しさん2010/11/13(土) 18:07:03
http://msdn.microsoft.com/ja-jp/library/bb546934.aspx#WritingCodeforDesignTime
この辺の問題な気がする
相対パスが役立たずになるのはどうにかして欲しいものだ
0554デフォルトの名無しさん2010/11/13(土) 20:54:40
>>551
コンテンツモデルの柔軟さは認めるけど、結局見た目の組み合わせじゃろくなもんで
きないんだよなあ。コントロールの振る舞いは組み合わせじゃどうにもならないか
ら、実はあまり柔軟でも簡単でもない。WPFのコンボボックス一つとっても最初
はリストボックス使って実装しようとしたけど、結局スクラッチから作ってるし。ボ
タンの中にボタンみたいな、なんの意味もないもんしかできない。
0555デフォルトの名無しさん2010/11/13(土) 20:58:41
つまり吉里吉里でいいということですね
0556デフォルトの名無しさん2010/11/13(土) 20:59:15
まったく持ってその通りですわ
0557デフォルトの名無しさん2010/11/13(土) 21:17:50
見た目の組み合わせはともかくとして、
GridやStackpanelは便利だと思う
0558デフォルトの名無しさん2010/11/13(土) 21:30:03
コンテンツモデルはたまにとんでもない挙動をするからなぁ
結局部品の中身を理解していないと使いこなせない。
0559デフォルトの名無しさん2010/11/13(土) 21:48:23
超エリート集団が作ったものがそんな糞なわけがない
0560デフォルトの名無しさん2010/11/13(土) 21:53:31
Meもか?
0561デフォルトの名無しさん2010/11/13(土) 21:55:11
Meたんとか超可愛いじゃない
0562デフォルトの名無しさん2010/11/13(土) 22:13:38
xamlって#regionみたいに折りたたんだりできないの?
0563デフォルトの名無しさん2010/11/13(土) 22:16:28
タグ単位で折りたためるじゃないか
0564デフォルトの名無しさん2010/11/13(土) 22:25:06
できたー
0565デフォルトの名無しさん2010/11/13(土) 22:30:56
>>563
そうだけど、コメントにした瞬間に萎える
0566デフォルトの名無しさん2010/11/13(土) 22:33:54
>>554
ぼのぼののおとうさんみたいだな
0567デフォルトの名無しさん2010/11/13(土) 22:34:55
Meは2000の片手間に鼻くそほじりながら作ったんだろ。

カスタムコントロール作ってるけど、なんか作り方が独特な感じで難しい。
Xaml側でイベントハンドラ登録できないので、要素のName属性使ってコード側から
インスタンス取得、そしてハンドラ登録という流れになる。

処理を結びつけるのはコマンドでやれってことなんだろうけど、
コマンドは発生タイミングを細かく制御できないよね?
例えば、2桁入力できるTextBoxを横に何個も並べたとして、
2桁入力した時点で自動的に右にフォーカス移動させるようにしたいときって
イベントだとTextBoxChangedとか使えばいいけど、コマンドではどうするのか。

なんだかいつものWindowとかUserControlでやる書き方とは違って、
コード側の記述が増えてしまってる。
0568デフォルトの名無しさん2010/11/13(土) 22:38:14
>Xaml側でイベントハンドラ登録できないので

できるだろ
0569デフォルトの名無しさん2010/11/13(土) 22:38:57
>>567
クラックソフトでも作ろうとしてるの?
0570デフォルトの名無しさん2010/11/13(土) 22:41:05
>>568
どうやるの?
>>569
扱いやすいコントロールをつくろうとしてるんだけど、なんでそう思ったの?
0571デフォルトの名無しさん2010/11/13(土) 22:43:05
カスタムコントロールは単体で配布したりするような
ちゃんとしたコントロールを作るためのもの。WinFormsでもカスタムコントロールは
OnPaintオーバーライド必須だっただろ。
0572デフォルトの名無しさん2010/11/13(土) 22:45:50
>>570
ボタン作ってダブルクリックしてみ
0573デフォルトの名無しさん2010/11/13(土) 22:49:27
>>572
ResourceDictionaryに書いてるからデザイナ使えないよ。
<Button Click= って書いても候補すらでないしコードビハインドが無いから指定できない。
これはカスタムコントロールの話だからね。

>>571
やっぱエレガントに書くのは諦めたほうがいいかな。
WinFormsやったことないからどうなってたのかわからん。
0574デフォルトの名無しさん2010/11/13(土) 22:51:32
>>573
SilverLight4をインストールしたらできる
0575デフォルトの名無しさん2010/11/13(土) 22:54:14
>>574
流れ的にちょっと分かりにくいので何が出来るのか詳しく頼んます。
デザイナ使ってのデザイン?
0576デフォルトの名無しさん2010/11/13(土) 23:01:43
>>574
SilverLight 銀の光ワロタ
0577デフォルトの名無しさん2010/11/13(土) 23:07:22
Silverlight4 ToolkitにはWPFデザイナの更新が多数含まれてるので
Silverlight使わないとしてもWPF使うなら必ずインストールしましょう
0578デフォルトの名無しさん2010/11/13(土) 23:10:46
はーい
0579デフォルトの名無しさん2010/11/13(土) 23:17:07
>>577
無くても普通にインテリセンス機能してるけど?
例えばブラシのカラー候補とか出る
自前のプロパティなどは候補には出てこないけど
Silverlight4 Toolkit 入れたらそれもできるようになる?
0580デフォルトの名無しさん2010/11/13(土) 23:51:06
コントロールの削除はXamlのコードだけではできないですよね?
0581デフォルトの名無しさん2010/11/13(土) 23:52:52
インジケータ的なものならVisualStateManagerで隠す
データ項目に対応するものならバインド元のデータを消す
0582デフォルトの名無しさん2010/11/13(土) 23:56:56
それってどうするの?
List<string>にボタン名の一覧が入っていて
一覧から削除すると、そのボタンが削除されるといったこともできますか?
0583デフォルトの名無しさん2010/11/13(土) 23:58:43
できる
DataTemplateでググれ
0584デフォルトの名無しさん2010/11/14(日) 00:03:07
Listで出来るか?
ObservableCollectionじゃなくて?
0585デフォルトの名無しさん2010/11/14(日) 00:05:06
>>570
どうやったらできなかったの?
0586デフォルトの名無しさん2010/11/14(日) 00:05:15
List<T>では削除はできないけど別にそういうことを聞いてるんじゃないでしょう
05875822010/11/14(日) 00:19:37
>>584でできました
ありがとう
05885822010/11/14(日) 00:33:18
ああ、でも>>584はちょっと違う
データクラスで保持してるコレクションデータを
ObservableCollectionに毎回追加しないといけないから

やっぱりList<string>のボタン名でそれぞれのボタンで表示して
任意のボタンを削除するならDataTemplateですか?
0589デフォルトの名無しさん2010/11/14(日) 00:59:03
>>588
List をラップした INotifyCollectionChanged 実装クラス作るのがいいと思うけど、
面倒だからよく ObservableCollection にコピー持たせる。

モデルとかビューモデル側でコレクションに要素足したときに
即座にビューに反映されて欲しければ INotifyCollectionChanged 必須。
0590デフォルトの名無しさん2010/11/14(日) 01:19:59
>>585
カスタムコントロールのXamlはルート要素がResourceDictionaryだからハンドラ指定はできないはずだが。
05915822010/11/14(日) 01:20:41
>>589
なるほどー、いろいろ試してみます
ありがとうございます
0592デフォルトの名無しさん2010/11/14(日) 01:30:04
最初からモデルかビューモデルに変更通知機能を入れとくのがベター
さすがにそんな上のレベルでListに依存するのは設計としてまずい
05935822010/11/14(日) 01:38:57
>>592
ビューモデルにINotifyCollectionChangedを実装しても
List<T>.Addでは変更通知されないですね
List<T>クラスを自作してそこにINotifyCollectionChanged入れるしかないのかな

そうなるとObservableCollectionでプロパティ公開してデータクラスのList<T>の値を追加していく方が楽なのかな
0594デフォルトの名無しさん2010/11/14(日) 03:57:45
>>590
そうだった
0595デフォルトの名無しさん2010/11/14(日) 04:53:27
  <WrapPanel Grid.Column="0">
   <ItemsControl ItemsSource="{Binding Names}">
   <ItemsControl.ItemTemplate>
   <DataTemplate>
   <Button Content="{Binding}" />
   </DataTemplate>
   </ItemsControl.ItemTemplate>
   </ItemsControl>
  </WrapPanel>

上記だとただ縦に並ぶだけです

パネルのデータテンプレートってどうすればいいですか?
かれころ5時間ぐらいぐぐってもわかりません
助けて
0596デフォルトの名無しさん2010/11/14(日) 05:29:43
テンプレートってレベルでいいなら、ItemsPanel かな。

もっと柔軟に、レイアウト方法を自作したいなら
Panel クラス継承して MeasureOverride とかを自作。
0597デフォルトの名無しさん2010/11/14(日) 06:02:38
ItemsPanel使ってどうすればいいんでしょうか?
質問する前からその単語でもぐぐってます
ItemsPanelTemplateでもぐぐってるけど
同じようなコードが見つからないんです

前にテスト用に作った時はあっさり作れたのでメモってなかったのが失敗
0598デフォルトの名無しさん2010/11/14(日) 06:30:44
半年ggr
0599デフォルトの名無しさん2010/11/14(日) 07:06:02
こういうケチ臭いところが
世界的に見て日本のプログラマのスキルが低い所以なんだろうね
優秀なソフトはいつも海外
ゲームも海外

日本は自社製の糞重いフレームワークで時代遅れのゲームしか作れない
0600デフォルトの名無しさん2010/11/14(日) 07:25:42
http://homepage2.nifty.com/natupaji/DxLib/
0601デフォルトの名無しさん2010/11/14(日) 08:29:47
>>599
むしろ基礎すら理解できていないコード切り貼り魔がいることが原因だと思う。
5時間ググる前に何が足りないか3分考えろ。
0602デフォルトの名無しさん2010/11/14(日) 08:34:22
海外フォーラムで質問すれば〜
0603デフォルトの名無しさん2010/11/14(日) 14:38:39
>>593
データクラスでList<T>公開して
周りから弄繰り回すこと自体が間違ってるよ
実際に実装の変更に対応できてないわけで、publicフィールド公開してんのと一緒だぞそれ
0604デフォルトの名無しさん2010/11/14(日) 18:39:16
>>603
お前はデータクラスの値をVMで毎回コピーしてVに公開してんのか?
0605デフォルトの名無しさん2010/11/15(月) 07:58:04
コピーする必要なんか無いだろ。
頭使えよ。。。
0606デフォルトの名無しさん2010/11/15(月) 20:41:58
WPFは大きさを相対的にそろえられるのか

<Button Height="3*"/>
<Button Height="2*"/>
みたいに。

今までだとちょっとだけ面倒だったな
0607デフォルトの名無しさん2010/11/15(月) 22:22:57
ちょっとしかうれしくないw
0608デフォルトの名無しさん2010/11/15(月) 22:40:57
ちょっとした幸せでいいんだ
0609デフォルトの名無しさん2010/11/15(月) 23:10:23
Grid 使った auto の方が便利かも。
多言語対応したりフォントサイズ変更したりに強いし。
0610デフォルトの名無しさん2010/11/15(月) 23:12:35
何も考えずにprismを入れたらユーザーフォルダがレイプされた
0611デフォルトの名無しさん2010/11/15(月) 23:18:05
prismには勝てなかったよ…
0612デフォルトの名無しさん2010/11/16(火) 01:53:34
WPFはデザイナで変えた部分とXMALが前面に出されてるな。

古いWindows Formアプリケーションだと
デザイナで変更された部分は基本的に隠されててキモかった。

Button1.click += button1_Click;
この部分が隠されてて
button1_Click(object,eventargs)
だけ現れててマジきもい
0613デフォルトの名無しさん2010/11/16(火) 06:46:06
InitializeComponent(); 簡単に見れたじゃん。
WPFの方が別ファイルでコソコソ作られててキモイ。
0614デフォルトの名無しさん2010/11/16(火) 07:08:07
>>613
WinFormsも別ファイルだろ
0615デフォルトの名無しさん2010/11/16(火) 07:27:20
隠されてはないだろ。
0616デフォルトの名無しさん2010/11/16(火) 08:01:22
InitializeComponent();は作成順序で不具合でたりするから
直接弄れるWPFのが便利
0617デフォルトの名無しさん2010/11/16(火) 10:24:09
WPFの隠し方は異常
0618デフォルトの名無しさん2010/11/16(火) 11:04:03
>>617
どこが隠蔽されてるって?XAMLが理解できないって話か?だとしたらお前が悪いw
あれは宣言型言語でオブジェクト ツリーを構築しているだけ。

全てWinFormsに似た等価な手続型言語で表すことができるが、
誰もやろうとしないのはそれがメンテナンス性を著しく損ねてしまう結果に終わると知っているから。

ま、WPF使った事ない人は表面だけ見て隠蔽されてるように感じるのだろう。
0619デフォルトの名無しさん2010/11/16(火) 11:21:09
いきなり煽りから本題に入るとは恐れ入ります。
プログラミングにどっぷりつかってる人間ってコミュニケーション能力低いってよく言われるが
こういうことなのでしょうな。
0620デフォルトの名無しさん2010/11/16(火) 12:18:55
まあおちつけ
0621デフォルトの名無しさん2010/11/16(火) 13:38:02
XAMLいい
最初、C#の文法だけでなくこっちも覚えなきゃならないのかよ
とか思ってたら案外簡単だった。
<Button Height="200">
みたいに書けばいいだけみたいだ。
むしろButton button1=new Button();button1.Height=100;
とかやるより簡単かもしれんね。
0622デフォルトの名無しさん2010/11/16(火) 13:51:17
その程度で全部済ませられるなら誰も悩まない
0623デフォルトの名無しさん2010/11/16(火) 13:58:12
ToggleButtonとContextMenuの組み合わせで、
トグルのIsCheckedとメニューのIsOpenをバインドして、表示させることはできたけれど、
右ボタンで、通常通りポップアップさせたときにはContextMenuService.Placementで指定したならびになるのに
左ボタンで、バインディング通して表示させたら、マウスカーソルの位置にポップアップされてしまう
どうすればいいの? プログラム書いたらすむんだろうけど
0624デフォルトの名無しさん2010/11/16(火) 14:01:52
拡張マークアップで
何じゃこの気持ち悪い書式はー!!
とプリプリした。
0625デフォルトの名無しさん2010/11/16(火) 14:23:21
>>619
煽りだけで本題書いてないwww
0626デフォルトの名無しさん2010/11/16(火) 18:05:23
TabControlのItemTemplateってどこに影響するのん?
いろんなサンプル見てると、閉じるボタンを付けたり、各タブに関係しそうなんだけど、
じぶんでちっちゃいコード書くとなんにも変わらない
0627デフォルトの名無しさん2010/11/16(火) 18:17:28
>>626
TabControl.ItemsSourceにバインディングしてる?
0628デフォルトの名無しさん2010/11/16(火) 18:51:44
バインディングしたらできたよ、ありがとう
0629デフォルトの名無しさん2010/11/17(水) 02:43:45
コントロールのTextBlockとLabelってどう違うんだろう
ただ文字表示するだけでしょ?ほとんど同じに見えるんだが
何が違うの
0630デフォルトの名無しさん2010/11/17(水) 03:35:51
テキスト描画系のコントロールの使い分けはこんなとこかな。MSDNに全部書いてある。

Labelはコントロールの説明用。
アクセスキーを設定して他のコントロールにフォーカス移したりできる。

TextBlockは少量のテキストをUIに表示するための物。
1行の表示に最適化されているけど数行まで高いパフォーマンスを発揮する。

数行以上のテキストを表示する場合はFlowDocumentを使う。(下に行くほど多機能で重い)
FlowDocumentScrollViewer スクロール表示
FlowDocumentPageViewer 1ページ単位のスクロール
FlowDocumentReader ユーザが表示モードを切り替える場合に使う

---
この辺は低レベルで滅多に使わないけど
Glyphs と GlyphRun を使用してグリフ レベルでテキスト コンテンツを生成するのが最速。
書式指定された文字列を描画したいならFormattedTextが適している。
0631デフォルトの名無しさん2010/11/17(水) 03:40:59
WPFで作ると倍以上時間がかかるな
慣れたらもっと早くなるのか・・・?
保守は楽だけど、作るまでが大変

やっぱりコンソールアプリが最強だな
0632デフォルトの名無しさん2010/11/17(水) 04:15:11
WPFだとVisual Studioのプロパティのとこに
説明が書いてないし
タイマーコンポーネントとか
OpenDialogやSaveDialog
みたいな便利なコンポーネントも標準でついてないんだね。
残念
0633デフォルトの名無しさん2010/11/17(水) 05:37:20
>タイマーコンポーネント
そもそも非UIデザインのコントロールなのに存在してたのがおかしい。(WM_TIMERの大義名分はあったけど)
UIスレッドで処理するならDispatcherTimer

>OpenDialogやSaveDialog
それは標準である。
Microsoft.Win32.OpenFileDialog
Microsoft.Win32.SaveFileDialog
.NET3.5まではXP風のクラシックスタイル、.NET4はVista風の新しいスタイル。
.NET3.5でVista風スタイル、.NET4でXP風スタイルを使いたい場合はWinFormsのDialog

WPF使ってるのにWinFormsのアセンブリから読み込むのはいい気分じゃないけど、同じのを再定義されるよりは遥かにマシだな。
0634デフォルトの名無しさん2010/11/17(水) 11:46:17
LabelのContentの内容を、バインドしてるbool値の値によって変更するにはどうすればいいんでしょうか?

例えば、VM上で公開しているbool値のプロパティ IsEnableとバインドしているとして、
IsEnableがTrueの場合:  Label Content="可能"
IsEnableがFalseの場合: Label Content="不可能"
といったことがしたいです。

TriggerかDataTriggerを使えばできそうなんですが、書き方がよくわからず、Intellisenseに怒られてばっかりで。
0635デフォルトの名無しさん2010/11/17(水) 11:46:47
意図的な空白ってなんだよ…
0636デフォルトの名無しさん2010/11/17(水) 12:20:52
>>634
普通にDataTriggerの中にSetter入れて文字列変更できるはずだけど
そういう可/不可みたいな一般的なものだったらIValueConverter実装してもいいと思う
その方が使いまわしが楽
0637デフォルトの名無しさん2010/11/17(水) 16:13:40
リソースとスタイルの違いがよくわからん
x : Key = "MyButton" TargetType = "Button"
みたいなx :keyいうのがついたらリソース
つかないで
TargetType = "Button"だけならスタイル
でいいのか?
0638デフォルトの名無しさん2010/11/17(水) 16:44:11
何でそんな偉そうなの。

リソースは最初に用意しといて後で使い回しましょう、って奴で
スタイルはプロパティの設定のセット。比較するのがそもそもおかしい。
で、エスパーレスすると、

x:Keyつかないと<Button>全部に適用
x:Keyついたら<Button Style="{StaticResource キー}"> だけに適用
0639デフォルトの名無しさん2010/11/17(水) 17:33:18
x:KeyはCSSでいうところのIDみたいなもんか
0640デフォルトの名無しさん2010/11/17(水) 17:36:17
というかXAMLはhtml+CSS関連の技術の応用だからなあ・・・
0641 ◆Jzt/EX0TGY8T 2010/11/17(水) 19:25:44
>>634
>>637
おれも2週間前まではそんな感じだったけど
もうマスターしちゃった
デリゲートも完全に理解した

>>640
未修得の技術を教えるのに未修得の技術を例にしても意味がない
0642デフォルトの名無しさん2010/11/17(水) 19:45:00
そうでもない
0643デフォルトの名無しさん2010/11/17(水) 19:50:39
なんであいつは未だにコテなの?
スキルもないのに自己顕示欲は人よりも強いの?
0644デフォルトの名無しさん2010/11/17(水) 19:59:41
ずっとコテでいてくれたほうが助かるよ
いつ変な吹き出し方してくるか分からんし判別出来た方がいい
0645デフォルトの名無しさん2010/11/17(水) 21:25:51
NG用にコテ付いてる方が便利
まぁコテなくてもすぐ判別できるぐらい鬱陶しいけどなw

いつも変わらぬアホさに安心感すら覚えるようになってきた。
人並みの頭はないけど少しは身に付けて前進している点は評価したい。
こんなのでも使いもせずに見当違いの所を叩いてる連中よりは遥かにマシ
0646 ◆Jzt/EX0TGY8T 2010/11/17(水) 21:42:11
初心者のみなさんはまず沢山のサンプルを見るとこだね
なぜそのようにしているのかひとつひとつ調べていくこと
そうすれば今の俺みたいにWPFマスターになれる

俺の作り方はまずコンソールアプリを作る
ロジックだけに集中するため
そしてどうしてもコンソールじゃ足りないGUI部分が見えてくる
そしたらそのロジックを利用してWPFでGUIを作る
このアプローチはWPFに最適だと思う
Winフォームの場合、その手軽さからまずGUIを作りながら
いろいろイメージしていって、データやコントロールするクラス
を作ったりするだろうけど、WPFではおすすめしない

WPFではまず、データ構造とロジックから作り始めた方が効率がいい
簡単なツールの場合はWPFが必要ない場合が多いしね。
0647デフォルトの名無しさん2010/11/17(水) 21:44:07
いいから素人は評価なんて下さずベット勉強しましょうね^^;
0648デフォルトの名無しさん2010/11/17(水) 21:46:31
さすがシムシティもどきの表示部分だけ作ってた人のいうことは違うなあ
0649デフォルトの名無しさん2010/11/17(水) 22:47:35
>>631
コンソールと比べんなw

まあ、マニュアル作らず使ってもらえるとか、
たいていの人でも触れるとかそういう足かせはめるとコンソールの方がかえって楽だけど。
0650デフォルトの名無しさん2010/11/17(水) 22:47:53
あっ逆、そういう足かせあるとWPFの方が楽。
0651デフォルトの名無しさん2010/11/17(水) 22:50:16
実際WPFで作られたソフトってほとんどないよね
■ このスレッドは過去ログ倉庫に格納されています