WPF(XAML, XBAP, .NET4.0)GUIプログラミング Part15
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2013/02/03(日) 12:52:38.89Visual Studio 2012 & 2010
http://www.microsoft.com/visualstudio/jpn/downloads
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 .NET Framework 4.5
http://msdn.microsoft.com/ja-jp/library/vstudio/5a4x27ek.aspx
前スレ
WPF(XAML, XBAP, .NET4.0)GUIプログラミング Part14
http://toro.2ch.net/test/read.cgi/tech/1351322296/
関連スレ
Microsoft Silverlight その9
http://toro.2ch.net/test/read.cgi/tech/1321150267/
コードを貼る場合は以下のサイトの利用をお勧め。
run codeのチェックは外しておきましょう。
http://ideone.com/
0153デフォルトの名無しさん
2013/02/08(金) 00:18:31.10そこまでしてイベントハンドラを使わない意味が分からない
その点には触れてないし分かりづらいだけで実質イベントハンドラそのものじゃねえか
0154デフォルトの名無しさん
2013/02/08(金) 00:19:26.470155124
2013/02/08(金) 00:19:49.86そういうことなんですか?
2つ目はどうにもできないのでしょうか?
0156デフォルトの名無しさん
2013/02/08(金) 00:20:49.690157デフォルトの名無しさん
2013/02/08(金) 00:21:56.38VからみるとVMもMも変わらない
ただのモデルにしか見えない
V → (VM+M)
0158デフォルトの名無しさん
2013/02/08(金) 00:24:58.04本 末 転 倒
この言葉が頭に浮かぶことがなんと多いことか
0159デフォルトの名無しさん
2013/02/08(金) 00:27:51.07こうだろ?
0160デフォルトの名無しさん
2013/02/08(金) 00:30:01.33それは勝手に人間様がそう思ってるだけで
Vから見たらVMはV側じゃないM側
ビジネスロジックが〜って言ってるのは人間だけでコード上は
VMはVの下請けじゃない
0161デフォルトの名無しさん
2013/02/08(金) 00:33:37.55あるいはcode golfに近いか
そんなもん初心者に読ませないで欲しい
0162デフォルトの名無しさん
2013/02/08(金) 00:34:59.83でも実際の役割はそうだろ?
VMでVが表示するためのプロパティ作ってるんだから
0163デフォルトの名無しさん
2013/02/08(金) 00:40:24.89VからM見る(binding)のも
VからVM見るのも
同じ
0164デフォルトの名無しさん
2013/02/08(金) 00:44:16.120165デフォルトの名無しさん
2013/02/08(金) 12:08:18.69仮想マシン側からILを見ると、C#もVBも大差ないようにね
0166デフォルトの名無しさん
2013/02/08(金) 12:15:08.11宗教論争してもしょうがないけど自分はVMはVに画面表示に専念させる為のブリッジだと思うけどね。テストなども考慮した上での。
0167デフォルトの名無しさん
2013/02/08(金) 12:24:04.25具体的には値が変わった時、前よりも値が増えた時と減った時で色を変えようとしてます。
変わった時点でその前のStoryboardを止めて新しいのをスタートさせてる。
コードビハインドで書いた奴は思った通りに動いたけれど。
定義だけXAMLでそのスタート、ストップはコードビハインドでも構いません。
0168デフォルトの名無しさん
2013/02/08(金) 12:33:39.160169デフォルトの名無しさん
2013/02/08(金) 14:03:01.940170デフォルトの名無しさん
2013/02/08(金) 14:05:13.880171デフォルトの名無しさん
2013/02/08(金) 15:37:26.030172デフォルトの名無しさん
2013/02/08(金) 15:39:23.38知らない無能は黙ってればよいよ。
0173デフォルトの名無しさん
2013/02/08(金) 16:15:30.86Visibilityに設定できるのはVisibility列挙値(Visible,Hidden,Collapsed)だけ
それ以外の値(true,falseとか)は無視されるので
デフォルト価のVisibility.Visibleになってるだけだな
0174デフォルトの名無しさん
2013/02/08(金) 16:20:33.09e.EditingElement as DataGridCell
はnullでした
0175デフォルトの名無しさん
2013/02/08(金) 16:30:36.740176デフォルトの名無しさん
2013/02/08(金) 16:31:15.89!!!
ありがとうございました。
0177デフォルトの名無しさん
2013/02/08(金) 16:36:33.61e.RowからDataGridRow
e.ColumnからDataGridTextColumn
が取れました
0178デフォルトの名無しさん
2013/02/08(金) 17:22:09.090179デフォルトの名無しさん
2013/02/08(金) 17:37:52.460180デフォルトの名無しさん
2013/02/08(金) 18:27:00.12無いんですよWPFにはそういうの
絶望した?した?
0181デフォルトの名無しさん
2013/02/08(金) 19:54:04.210182デフォルトの名無しさん
2013/02/08(金) 20:09:21.03言語が支援してるわけじゃねーもん
0183デフォルトの名無しさん
2013/02/08(金) 20:19:01.120184デフォルトの名無しさん
2013/02/08(金) 20:26:02.36IDEがあるにしても限度は必要だと感じてしまうよな
0185デフォルトの名無しさん
2013/02/08(金) 21:41:56.330186デフォルトの名無しさん
2013/02/08(金) 22:37:59.28Rx入門v0.1.pdfをもう少し初心者向けの解説増やしてもらえませんか?
具体的にはイベントに関してなんですが、neueさん等もWPFやWP前提でFormでどう使えばいいのか実装例含めて解説して欲しいです。
0187デフォルトの名無しさん
2013/02/08(金) 22:40:23.070188デフォルトの名無しさん
2013/02/08(金) 22:41:47.160189デフォルトの名無しさん
2013/02/08(金) 22:53:46.060190デフォルトの名無しさん
2013/02/08(金) 22:54:44.25文句あるならお宅らが答えてもいいんじゃよ?
答えられないでしょ?
0191デフォルトの名無しさん
2013/02/08(金) 23:02:27.51このままフォームアプリケーションと同時でサポートされていく感じ?
それともsliverlightのように死亡確定?
0192185
2013/02/08(金) 23:11:00.84http://ideone.com/LoSjNb
0193デフォルトの名無しさん
2013/02/08(金) 23:13:35.15そもそもクライアントアプリに将来性がない
MSはHTML5を全面に押し出して今絶好調みたいだからこのままどんどんwebにシフトしていく
0194デフォルトの名無しさん
2013/02/08(金) 23:13:59.83このまま微調整だけくわえられていくのか
大幅に変わるのかも分からない
今のままだとフェードアウト確定
言語からサポートを受けるようになれば…
0195デフォルトの名無しさん
2013/02/08(金) 23:36:52.600196デフォルトの名無しさん
2013/02/08(金) 23:39:53.46プロパティの setter じゃなくて、DependencyProperty.Register に渡す PropertyMetadata の PropertyChangedCallback 内で処理する。
setter、getter はユーザーコードから使いやすくするための単なるラッパーで、フレームワークからは呼び出されない
(フレームワークがプロパティ値を設定・取得するときは SetValue・GetValue が使われる)。
0197185
2013/02/09(土) 00:04:16.26ありがとうございます。
そういうことだったんですね、修正しました。
http://ideone.com/Naxl7H
でも、静的なのにどこに値を格納してるのかわかりません。
0198デフォルトの名無しさん
2013/02/09(土) 00:07:24.91多分WinRTでデスクトップアプリも作れるようにすると思うし。
HTMLはそれだけって風にはならなそうな気がするけど。
WinMDの実装技術としてHTMLも選べてネイティブと一緒にできるってのが正しいあり方な気がするわ
TypescriptでXAMLをナチュラルに使えるようになると面白いんだが。
0199196
2013/02/09(土) 00:29:14.67ValidateValueCallback は値の検証用。
WPF フレームワークのプロパティ値は SetValue で直接値を代入した時だけメモリが確保される仕様。クラスのインスタンスは単なるハンドル。
インスタンスが作られた時に全てのプロパティ用にメモリを確保すると、メモリをバカ食いするし、他のインスタンスと同じ値ばっかりで無駄が多い、
あと、Style や VisualTree とかで同じ値に設定する状況でインスタンス一個一個の値を設定することになって重い。
それを避けるために、他と値が共有できる状況なら、値を共有して軽くしてる(プロキシ・パターンとかフライウェイト・パターン)。
0200196
2013/02/09(土) 00:33:41.690201185
2013/02/09(土) 01:23:12.30度々ありがとうございます。
WinForms感覚で考えると全然駄目なんですね、
無事、依存関係プロパティ自体を作ることが出来ました。
http://ideone.com/nRVJ6b
ただ、バインドがうまく入ってないのか、Textの値が変わってくれません。
0202デフォルトの名無しさん
2013/02/09(土) 05:13:08.92TextPropertyにtextbox2を付けないとダメじゃね。subがsharedだし見えないでしょ。
0203デフォルトの名無しさん
2013/02/09(土) 05:16:56.16どううまく行かないのか書いてないからわからんけど
バインドしてるプロパティの値を変えても、表示されるTextに変化がないってことなら
@XAMLでのバインドの仕方が間違ってる。OneWayないしTwoWayに。(OneTimeやOneWayToSourceではダメ)
AプロパティにINotifyPropertyChangedを実装してない
このどっちかじゃないかな
ちなみに、やりたいとこがDate型の値をyyyy/MMで表示したいだけなら
わざわざTextBoxを継承した独自のコントロール作ったり大がかりなことするより
Converterかました方がずっとお手軽だと思うw
0204デフォルトの名無しさん
2013/02/09(土) 05:17:20.370205デフォルトの名無しさん
2013/02/09(土) 05:38:13.390206デフォルトの名無しさん
2013/02/09(土) 12:26:35.07新しいプロジェクト作って、そのコードと以下を追加して、実行してみたけど、期待通りに表示されたよ。
<StackPanel>
<local:TextBox2nd x:Name="_textBox2"/>
<Button Content="Set" Click="Button_Click_1"/>
</StackPanel>
Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
_textBox2.DateValue = DateTime.Now
End Sub
最小限の構成で試してみたら?
0207206
2013/02/09(土) 12:31:12.870208185
2013/02/09(土) 13:23:42.08TwoWayにしています。
バインドするプロパティにINotifyPropertyChangedを実装していなかったので、実装しましたが、
Textに日付の文字列が入ってくれません。
他にもお手軽な方法があるのがあったんですね、まぁいつかはわからないといけなくなると思うので練習がてらカスタムコントロールでやっていこうと思います。
>>206
実行してみましたが、DateValueに値が入っていることが確認できました。
自分もそこまでは行くんですが、それの後にTextに日付が入らないことが最後の問題なっています。
まさかここまで難しいとは思いもよらなかったです。
http://ideone.com/YLTgxE
0209デフォルトの名無しさん
2013/02/09(土) 14:05:51.74RichTextBoxをクリックしてもListBoxItemが選択されません。
RichTextBoxをクリックしてListBoxItemが選択されるようにするにはどのようにすればいいでしょうか。
0210デフォルトの名無しさん
2013/02/09(土) 17:57:00.97そのコード、TextBox を継承するなら TextProperty を再定義する必要はないよ。
TextBox が公開している OnTextChanged を override すれば実現できる。
何らかの理由で TextBox.TextProperty の PropertyChangedCallback を置き換えたい場合は、
静的コンストラクタで TextProperty.OverrideMetadata メソッドを使えば可能。再定義は不要。
0211デフォルトの名無しさん
2013/02/09(土) 19:21:13.54Bitmap bmp = new Bitmap("test.bmp");
こう書いたのですがエラーが出て強制終了します
ファイル名を絶対パスで書くとエラー出ませんでした
ファイルはカレントに置いてあるはずなんですが、書き方間違ってますか?
0212デフォルトの名無しさん
2013/02/09(土) 19:39:44.620213185
2013/02/09(土) 20:56:01.55再定義をやめても、今までどおり動作しました。
Dateを入れたときにTextには反映されていますが、Textを変更した時にDateに反映されないのは
DateValueにPropertyChangedが実装されていないからでしょうか?
0214デフォルトの名無しさん
2013/02/09(土) 21:23:44.02{
public class MyConverter : IValueConverter
{
}
}
<StackPanel HorizontalAlignment="Center"
VerticalAlignment="Center"
xmlns:local="clr-namespace:Hoge">
<CheckBox IsChecked="{Binding Flag, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={MyConverter}}" />
</StackPanel>
コンパイルが通りません
エラー1XmlNamespace、Assembly または ClrNamespace が Mapping 命令にありません。 行 19 位置 41.
エラー2型 'MyConverter' が見つかりませんでした。アセンブリ参照が失われていないか、また、すべてのアセンブリがビルドされているかを確認してください。
何が悪いのでしょうか
0215デフォルトの名無しさん
2013/02/09(土) 21:30:23.420216デフォルトの名無しさん
2013/02/09(土) 21:31:33.930217デフォルトの名無しさん
2013/02/09(土) 21:32:53.56exeを起動してみたところ古いデータになっていて、デバッグなしで実行していたせいでした。
ありがとうございます
0218デフォルトの名無しさん
2013/02/09(土) 21:38:57.58はい
>>216
ありがとうございました。
0219デフォルトの名無しさん
2013/02/09(土) 21:46:55.62Stack Overflow: Selecting a Textbox Item in a Listbox does not change the selected item of the listbox
http://stackoverflow.com/questions/653524/
>>213
> DateValueにPropertyChangedが実装されていないからでしょうか?
関係ないんじゃない? OnTextChanged にブレークポイントを置いて実行してみて、呼ばれているかどうか確認してみれば?
>>214
"Converter={MyConverter}" が駄目。そこにクラス名は書けない。下の解説を読みなおして。
MSDN : IValueConverter インターフェイス
http://msdn.microsoft.com/ja-jp/library/system.windows.data.ivalueconverter.aspx
0220185
2013/02/09(土) 23:45:57.49無事完成しました。
ありがとうございます。
ブレイク貼ったら全然通ってませんでした。
イベントにして解決しました。Shadowsでなんで走らなかったのかは謎ですが・・・
http://ideone.com/mYEQKK
身近にWPFに詳しい人がいなかったので、とても助かりました。
独学じゃ挫折しそうです。
ありがとうございました。
0221デフォルトの名無しさん
2013/02/09(土) 23:55:55.36>>210 は Private Shared Shadows Sub OnTextChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) じゃなくて、
Protected Overrides Sub OnTextChanged(e As TextChangedEventArgs) を使えって意味だと思う。
0222185
2013/02/10(日) 01:00:04.08>>220のLostfocusイベントのところをすでにあるOnLostFocusをOverrideしたら、同様に動作しました。
こっちのほうが見栄えがいいですね。
ありがとうございます。
これは依存関係プロパティとは関係ないのでSetValueとかではなく、通常のプロパティを弄る感じなんですね
やっといろいろ分かって来ました。
0223デフォルトの名無しさん
2013/02/10(日) 23:34:37.87イベント駆動だと、StartupUriに書いたクラスのコンストラクタもしくはLoadedイベントに書くはずですが・・・
0224デフォルトの名無しさん
2013/02/10(日) 23:41:03.480225デフォルトの名無しさん
2013/02/10(日) 23:49:23.51軽く調べてみたら、App.xamlのstartupuriを消して、startupにして
そこからVMとVを作るという方法があるようですが・・・
0226デフォルトの名無しさん
2013/02/11(月) 00:14:38.27MVVMはビューをスマートに実装する仕組み以上のものじゃない。一つのビューに閉じた話。
0227デフォルトの名無しさん
2013/02/11(月) 01:37:28.79Prismとかでググれ
0228デフォルトの名無しさん
2013/02/11(月) 03:28:16.720229デフォルトの名無しさん
2013/02/11(月) 10:27:08.19でもWPFではDrawingを動的に変更するのはやらないのが基本。Visualを動かせば勝手に反映される。
頻繁なOnRenderとかもってのほか。
0230225
2013/02/11(月) 12:21:55.80アプリケーションを起動したときに、最初に
DateContext = new Model();
とかやるじゃないですか
ここはどこでやるべきなのかなーと
Windows.csには原則何も書いてはいけないらしいですから、Viewではないですし
0231デフォルトの名無しさん
2013/02/11(月) 12:26:06.09コンストラクタに書くのが普通
コードビハインドを書いてはいけないなんてことはない。それ以外のコードも書くし必要ならイベントハンドラも使う。
0232デフォルトの名無しさん
2013/02/11(月) 12:30:45.770233デフォルトの名無しさん
2013/02/11(月) 12:44:15.890234デフォルトの名無しさん
2013/02/11(月) 12:52:55.48責任取れカス
0235デフォルトの名無しさん
2013/02/11(月) 12:58:06.51MVVMやるならVMの単体テストを書け。
Prismがなんでああいう構造になってるかなんて自分でテスト書いてみないと理解できない。
0236デフォルトの名無しさん
2013/02/11(月) 13:04:44.760237デフォルトの名無しさん
2013/02/11(月) 13:20:59.10これらを知らないと原則を盲目的に守るしかなくなる
コードビハインドをあまり書くなってのは、単にUIに依存したコードはテストしにくいから
0238デフォルトの名無しさん
2013/02/11(月) 13:25:27.570239デフォルトの名無しさん
2013/02/11(月) 13:32:09.370240デフォルトの名無しさん
2013/02/11(月) 17:47:59.48ありがとうございます
0241デフォルトの名無しさん
2013/02/11(月) 18:30:51.16ViewModelもIDisposableにして、Window終了時に確実にDisposeを呼びたいんですが、
Closedイベントで (DataContext as IDisposable).Dispose(); とするのが普通ですか?
0242デフォルトの名無しさん
2013/02/11(月) 18:36:44.800243デフォルトの名無しさん
2013/02/11(月) 18:42:50.360244デフォルトの名無しさん
2013/02/12(火) 06:31:41.500245デフォルトの名無しさん
2013/02/12(火) 07:19:53.04http://www.atmarkit.co.jp/fdotnet/chushin/introwpf_06/introwpf_06_02.html
つまりbuttonが10個あるとして、10個全てのイベントの中身が違うとしたら、
ViewModel.csにICommandを実装したらクラスを10個書く・・・
そういうことを上の記事は推奨しているように見えます
0246デフォルトの名無しさん
2013/02/12(火) 07:47:09.83クラス10個は書かないでいいだろうけど…。
よく使われてるのは、汎用的なICommandを実装したクラスを1つ用意して、
それを使いまわして、個々の実装はデリゲートでメソッドを受け取るって形だと思う。
0247デフォルトの名無しさん
2013/02/12(火) 07:50:58.390248デフォルトの名無しさん
2013/02/12(火) 08:31:47.05ありがとうございました。
DelegateCommandについては上記記事にも書いてました
0249デフォルトの名無しさん
2013/02/12(火) 09:04:51.150250デフォルトの名無しさん
2013/02/12(火) 14:37:27.13IsChecked={Binding Path=変数 Mode=Twoway}
とするのが一般的ですか?
0251デフォルトの名無しさん
2013/02/12(火) 14:56:25.52問題は「一般的かどうか」より「必要かどうか」だろ
0252デフォルトの名無しさん
2013/02/12(火) 14:57:33.81IsChecked={Binding プロパティ名, Mode=Twoway}
で行ける。
■ このスレッドは過去ログ倉庫に格納されています