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

WPF(XAML, XBAP, .Net3.5)GUIプログラミング Part5

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/12/27(日) 10:58:30
あたらしいユーザーインターフェースシステム、Windows Presentation Frameworkについ
て語るスレ。.NET3.5 SP1 もリリースされて盛り上がってまいりますた。

Visual Studio 2008
ttp://www.microsoft.com/japan/msdn/vstudio/
Microsoft .NET Framework 3.5 Service Pack 1
ttp://www.microsoft.com/downloads/details.aspx?FamilyId=AB99342F-5D1A-413D-8319-81DA479AB0D7&displaylang=ja
WPF Toolkit - June 2009 Release
ttp://wpf.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=29117
Visual Studio 2010
ttp://www.microsoft.com/japan/msdn/vstudio/2010/overview/

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

過去スレ
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/
0629デフォルトの名無しさん2010/04/23(金) 18:49:52
>>627
WPFじゃなくてWinFormのでいいんだよな?
LineHeightってどのクラスのプロパティ?
行間ってのは段落間じゃない行間のことでOK?

まあEM_SETPARAFORMATとPARAFORMAT2使うことになると思う

>>628
にゅりゅ ってエロい響きだな
0630デフォルトの名無しさん2010/04/23(金) 19:13:55
>627
WPFでフォントコントロールったら、
FormattedText クラスじゃないんか?

ttp://msdn.microsoft.com/ja-jp/library/system.windows.media.formattedtext%28v=VS.80%29.aspx
06316292010/04/23(金) 19:16:34
あ、ここWPFスレだった
C#スレと勘違いしてた、ごめん
0632デフォルトの名無しさん2010/04/23(金) 19:22:45
FlowDocument全体の行間ならFlowDocument.LineHeightで問題ないと思うけど
0633デフォルトの名無しさん2010/04/23(金) 22:08:51
>>627
WPFの方
0634デフォルトの名無しさん2010/04/24(土) 12:07:11
すまん。
自己解決した。
トークンごとに読み取ってそのトークンをパラグラフを追加するときに\r\nを無視しないのが原因だったらしい。
xamlを調べて初めて原因が分かった
間違い
<flowdocument>
 <paragarh>aaaa<run>(見えないが\r)</run><run>(見えないが\n)</run></paragrah>
</flowdoument>
正しくは
<flowdocument>
 <paragarh><run>aaaa</run></paragrah>
</flowdoument>
0635デフォルトの名無しさん2010/04/24(土) 14:56:26
Paragraph p = richtextbox.CaretPostion.Paragraph;
TextRange range = new TextRange(p.ContentStart, p.ContentEnd);
this.para = new Paragraph();
this.para.Margin = new Thickness(0);
this.Spilitter.Parse(range.Text);
this.doc.Blocks.InsertBefore(p, this.para);
this.doc.Blocks.Remove(p);
パラグラフの置き換えを行うとキャレットがパラグラフの一番最後に移動してしまう。これを防ぐ方法はない?あらかじめCaretPostionを覚えておいて、置き換えた後で戻してもダメだった。
0636デフォルトの名無しさん2010/04/24(土) 16:15:42
>>635
var curP = richTextBox.CaretPosition.Paragraph;
var offset = curP.ContentStart.GetOffsetToPosition(richTextBox.CaretPosition);
var newP = new Paragraph();
newP.Inlines.Add("New Paragraph");
richTextBox.Document.Blocks.InsertBefore(curP, newP);
richTextBox.Document.Blocks.Remove(curP);
richTextBox.CaretPosition = newP.ContentStart.GetPositionAtOffset(offset) ?? newP.ContentEnd;
これじゃダメなん?
0637デフォルトの名無しさん2010/04/24(土) 21:42:03
>>636
それだとだめだ。
aaa
(aaaの先頭でzを入力)
zaaa
(連続で入力すると、zazaaになってしまう)

なんでWPFってこんなに面倒なの?
文字単位で選択することもできないし、キャレットを文字単位で動かすことすらできない。
開発者は馬鹿なの?
0638デフォルトの名無しさん2010/04/24(土) 22:10:32
>>637
何がしたいのか分からないんだけど。
文字単位で選択するなら:
richTextBox.Selection.Select(richTextBox.CaretPosition, richTextBox.CaretPosition.GetPositionAtOffset(10));
キャレットを次の文字に移動するなら:
richTextBox.CaretPosition = richTextBox.CaretPosition.GetNextInsertionPosition(LogicalDirection.Forward);

TextPointer クラスと RichTextBox クラスについて、もうちょっと調べたら?
0639デフォルトの名無しさん2010/04/24(土) 22:33:53
>>638
目がシパシパしたwww
0640デフォルトの名無しさん2010/04/25(日) 02:37:57
>>638
パラグラフが
aaa
となっているときに
bbb
aaa
とすると、aaaを削除するとキャレットがaaaの先頭にあるにもかかわらず、bbbの後ろに移動してしまうのをどうにかして防ぎたい。
TextPointerについても調べたんだが、画面に表示されている文字単位で位置を取得するメソッドはなぜかなかった。
0641デフォルトの名無しさん2010/04/25(日) 09:54:47
>>640
>aaaを削除すると

>>635
this.doc.Blocks.Remove(p);に当たるのかな
言ってることがあんまよくわからないけど、空のパラグラフを置いといてその先頭にキャレット置くというのがやりたいんじゃないの?
ソースはそうなってないだろ
0642デフォルトの名無しさん2010/04/25(日) 10:24:40
>>641
>言ってることがあんまよくわからないけど、空のパラグラフを置いといてその先頭にキャレット置くというのがやりたいんじゃないの?
それじゃなくて、パラグラフを置き換えてもキャレットの位置をそのまま保つということがやりたい
0643デフォルトの名無しさん2010/04/25(日) 23:47:54
ScrollViewerのマウスホイールによるスクロールを無効化する方法はありますか?
0644デフォルトの名無しさん2010/04/26(月) 00:03:42
PreviewMouseWheelでHandledしちゃうとか
0645デフォルトの名無しさん2010/04/26(月) 00:52:19
>>644
e.Handle = trueでうまくいきました
ありがとうございます
0646デフォルトの名無しさん2010/04/26(月) 03:26:57
こんな感じでボタンを並べるにはどうすればいいんでしょうか?
http://uproda.2ch-library.com/239369drL/lib239369.png

平行四辺形とかでしたらなんとかなるんですが・・・
0647デフォルトの名無しさん2010/04/26(月) 04:25:39
表示部分にしかあたり判定がないんだから同じpanelに全部かさねて表示だけかえればいいじゃない
そんな形なら標準ボタンを使うわけでもないんでしょ
0648デフォルトの名無しさん2010/04/26(月) 06:27:53
http://ufcpp.net/study/dotnet/wpf_uielement.html
傾斜とかもできるので上辺もしくは下辺を短くするとか
できるかなあと思ったんですが無理ですかね?
0649デフォルトの名無しさん2010/04/26(月) 07:04:59
Expression Blend で簡単に星形のボタンとか作れるみたいだね。
0650デフォルトの名無しさん2010/04/26(月) 07:09:59
ジオメトリの作り方がわからないから四角の変形で作りたいっていうなら
アフィン変換使いなよ自分で計算してな
0651デフォルトの名無しさん2010/04/26(月) 08:48:31
Blend使えればベストだけどボタンぐらいならXAMLだけでなんとかなる。
ContorolTemplateを書けばいいだけでサンプルも結構転がってるから。
あとエッセンシャルWPF読んどけ
0652デフォルトの名無しさん2010/04/26(月) 09:41:08
>>648
それは線形変換で表現できないから無理
高校数学C参照
0653デフォルトの名無しさん2010/04/26(月) 13:08:53
文字単位で選択するメソッドがないので作ってみた。だが、どうも、遅いような気がする。これより早い方法があったら教えてほしい。
TextPointer getPostionAtCharacters(int offset)
{
for (int i = offset; this.Document.ContentStart.GetPositionAtOffset(i) != this.Document.ContentEnd; i++)
{
TextRange range = new TextRange(this.Document.ContentStart, this.Document.ContentStart.GetPositionAtOffset(i));
if (range.Text.Length == offset)
return range.End;
}
return null;
}
0654デフォルトの名無しさん2010/04/26(月) 15:05:53
>>649>>650>>651
ありがとうございます。

しかしここまでGUIをいろいろ変えやすいとなるとデザインセンスないと
きついですね・・・
0655デフォルトの名無しさん2010/04/26(月) 18:47:52
宇宙仮面のHP
エラーでまくり
0656デフォルトの名無しさん2010/04/26(月) 19:03:56
RadioButtonをC#からCheckする方法ありますか?
0657デフォルトの名無しさん2010/04/26(月) 19:07:39
あるよ
0658デフォルトの名無しさん2010/04/26(月) 20:20:09
>>656
XAML側でコントロールに名前(Name="hoge")とかやれば
C#側から従来のWinFormのようにいじり放題
0659デフォルトの名無しさん2010/04/26(月) 20:38:00
でも実際にはバインディングオブジェクトのプロパティの方を操作するよね
0660デフォルトの名無しさん2010/04/26(月) 20:41:36
WPFは要素にName付けたら負け
0661デフォルトの名無しさん2010/04/26(月) 20:46:27
それなんてみすりーど。
06626562010/04/26(月) 21:22:55
>>657-661
>>658さんの方法以外はどのように書けばいいんでしょうか?
0663デフォルトの名無しさん2010/04/26(月) 21:38:08
気にせず名前付けたらいい
0664デフォルトの名無しさん2010/04/27(火) 00:08:38
>>660
コードビハインド使ったら負け
0665デフォルトの名無しさん2010/04/27(火) 00:53:01
真の勝者はXAMLを使わない
0666デフォルトの名無しさん2010/04/27(火) 00:54:50
blend+コードビハインド
都会派はこれ
0667デフォルトの名無しさん2010/04/27(火) 00:55:03
ソフトなんか他人に作らせるよね真の勝者なら。
0668デフォルトの名無しさん2010/04/27(火) 00:57:01
こだわりのソフト作成なら至福だろ
作らされてるなら敗者
0669デフォルトの名無しさん2010/04/27(火) 01:27:42
WPFの場合

プログラマーはバインド関連をマスター
デザイナーはXAML関連をマスター

そんなところですかね?
0670デフォルトの名無しさん2010/04/27(火) 02:18:51
BeginAnimationのタイミングが異なっても、
アニメの動きのタイミングを同期させる方法ってありますか。
0671デフォルトの名無しさん2010/04/27(火) 04:59:26
あるよ
0672デフォルトの名無しさん2010/04/27(火) 08:28:30
INotifyPropertyChangedから依存プロパティへのバインドが機能したりしなかったりする
わけがわからない
0673デフォルトの名無しさん2010/04/27(火) 09:00:47
>>669
正解じゃない。

プログラマーはバインド関連とXAML関連をマスター 。
0674デフォルトの名無しさん2010/04/27(火) 22:14:00
XAML自体はマスターするには.NETプログラミングに習熟してないといけないからデザイナには酷
デザイナーはExpression BlendとXAMLの基礎事項をマスター
0675デフォルトの名無しさん2010/04/28(水) 00:05:19
だな。MSはデザイナがXAMLを触らなくても大丈夫なようにツールを揃えた方が良いだろね。
0676デフォルトの名無しさん2010/04/28(水) 00:08:47
WPFのバインディングは勉強すればするほど魅力的なんだよな
C#のコントロールにも一応項目あったけどここまで使えたっけ?
0677デフォルトの名無しさん2010/04/28(水) 00:15:35
デザイナが実際には動かさないスタイルを自由奔放に作成して
上司は「デザイナの作った物がそのまま動く!素晴らしい!」と言い出して
結局はプログラマが地獄を見る。そういう代物だろ?
0678デフォルトの名無しさん2010/04/28(水) 00:17:38
うーん
まあ前ほどは地獄をみないんじゃないかな
バインディングが強力なのでいい感じだよ
0679デフォルトの名無しさん2010/04/28(水) 00:17:43
そこは誤解がないようにちゃんと主張しろよ
0680デフォルトの名無しさん2010/04/28(水) 00:18:51
.NET 4.0 では NumericUpDown コントロールはサポートされますか?
0681デフォルトの名無しさん2010/04/28(水) 00:19:17
デザイナーが作る範囲は所詮はwebページで言えばhtmlに毛の生えたことしかしてないからなあ
0682デフォルトの名無しさん2010/04/28(水) 01:14:12
.NET4な。CLRは4.0。
0683デフォルトの名無しさん2010/04/28(水) 01:48:52
blend上で動くなら何も心配しなくていいんじゃないの何かあるの?
0684デフォルトの名無しさん2010/04/28(水) 02:07:24
http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_02/uiframework_02_04.html
上のサイトの中央付近から始まる「コレクション・オブジェクトへのバインド」のところを
動かそうとしたのですが下記のようなエラーとなり動きません。

>エラー 1 値 ' {Binding}' をプロパティ 'ItemsSource' に割り当てることができません。
>型 'IEnumerable' のプロパティ 'ItemsSource' は文字列として指定できません。

どのように対処すればよいのでしょうか?
0685デフォルトの名無しさん2010/04/28(水) 02:14:01
>>682
.NET 4 と .NET 4.0 の違いを詳しく教えてください。
区別すべきなのでしょうか?
0686デフォルトの名無しさん2010/04/28(水) 02:15:10
.NET 4.0 とかくことは意味があると思いますが、
.NET 4 と指摘していることについて詳しく教えてください
0687デフォルトの名無しさん2010/04/28(水) 02:19:37
>>684
素直にXAMLで書けよ
06886842010/04/28(水) 02:28:18
自己解決しました。
ListBoxを使っているほかのサンプルと見比べたところ

<Grid x:Name="MainPanel" Loaded="MainPanel_Loaded">
<ListBox ItemsSource=" {Binding}"
DisplayMemberPath="Bmi"/>
</Grid>



<ListBox ItemsSource=" {Binding}"
{Binding}の前の半角スペースが原因で文字列として認識されていたようです。


>>687
質問に対する答えになってないと思いますが・・・
0689デフォルトの名無しさん2010/04/28(水) 02:37:07
VS2005 / .NET2.0 しか許されない環境で、
MVVMを模倣して手動でモデリングしたクラスプログラミングをすることは効率化になりますか?
0690デフォルトの名無しさん2010/04/28(水) 02:37:15
ガベージイン、ガベージアウト
0691デフォルトの名無しさん2010/04/28(水) 02:43:57
>>685-686
「.NET Framework 4」が正式名称。
.NET 4.0と言っても問題なく通じるので実用上の問題はない。わざわざ指摘する程の事でもないだろ>>682
06926892010/04/28(水) 03:17:09
>>74が気になるなぁ。リフレクション調べてみるか…
0693デフォルトの名無しさん2010/04/28(水) 03:21:53
>>692
目指す目標としてXAMLなどがあるんだし、それと同じ仕組みにすれば
MVVMも可能じゃないかな?

まあ自前であれこれするより本当はWPFにするべきなんだが

ところでなんでそんな古い環境にこだわらないといけないんだろうw
0694デフォルトの名無しさん2010/04/28(水) 05:26:27
VとVMの疎結合さえ保てればとりあえずMVVMって言えるのかな?
・Viewを定義する「なにか」を設計する
 (WPFではXAML)
・「なにか」からViewを生成するライブラリを実装する
 (WPFではSystem.Presentationとかかな?)
・「なにか」と実行時バインドする方法も実装する
 (依存プロパティみたいな仕組み。ここでリフレクションががっつり登場)

マンドクセ・・・
XAMLの仕様はそのまま使って.net 2.0 WinFormsでもViewが構築できるライブラリ作れば
それなりに需要は・・・ないか
0695デフォルトの名無しさん2010/04/28(水) 05:34:57
一番重要なのはMとVVMと間のデカップリングだと思うよ。
0696デフォルトの名無しさん2010/04/28(水) 05:37:58
そういえば依存関係を切り離せるコンテナってあったよね?
あれは使えないの?
0697デフォルトの名無しさん2010/04/28(水) 06:30:25
ざっくりいうとVMはVからのMに対するブリッジって認識だがよろし?

>693
ぶっちゃけマシン性能にもよるんだろうが未だにWPF遅くね?
頻繁な更新が必要なデイトレアプリみたいなもんとか向いてなさそうなんだが。

>694
そげんな感じのもん作ったお。未だに2000とかにも配慮しなきゃいけなくてな( ^ω^)・・・
0698デフォルトの名無しさん2010/04/28(水) 06:42:25
DIコンテナは未だによくわからん・・・
0699デフォルトの名無しさん2010/04/28(水) 07:39:00
>>693-697
thx.
2005なのは、そういう環境でWindowsXpとWindowsCEの開発レッスンを受けてますw
自分が2000使ってるのでその点も嬉しいかなw
0700デフォルトの名無しさん2010/04/28(水) 10:36:39
>>696
CAL(Prism)なんかはUnityのDIコンテナ使ってるよ。

.NET4で追加されたMEFもかな、仕組みはDIコンテナっぽいが。
0701デフォルトの名無しさん2010/04/28(水) 10:46:10
ブラウザアプリでエクセルを操作するプログラムが入っててエクセルオブジェクトバージョンが違ってる人がアドレス開いてアプリ操作したらどうなるの?
0702デフォルトの名無しさん2010/04/28(水) 10:52:10
WPFが描画にGPUとCPUどっちを使ってるかどうすればわかるんですか?
自分のグラボがWPFに対応出来てるかしりたいんです
0703デフォルトの名無しさん2010/04/28(水) 12:52:20
>>702
WPF のパフォーマンス プロファイリング ツール
http://msdn.microsoft.com/ja-jp/library/aa969767(VS.90).aspx
0704デフォルトの名無しさん2010/04/28(水) 13:55:32
依存関係の向きがV→VM→Mとなってればいいだけのことで
VのコードビハインドでVとVMを手で結びつければバインディングはいらないよ
コマンドはVMのメソッドを呼び出せばいいだけ
0705デフォルトの名無しさん2010/04/28(水) 14:11:36
MVVMの目的はVMを単体テストすることだよ
それが必要ないんだったらコードビハインドをVMとみなして
XAMLで自身のプロパティにバインドするだけでいい
それが本来WPFで想定されていたバインディングの使い方
0706デフォルトの名無しさん2010/04/28(水) 14:12:00
C++ と XAML の組み合わせで使えないのはなんで?
0707デフォルトの名無しさん2010/04/28(水) 14:22:27
WPFはマネージコード専用だから
C++/CLIで使えないのは単にMSにやる気がないから
WPFはアンマネージドな世界との相互運用がしづらいしものすごく高レベルなので
わざわざC++/CLIから使うというのはちょっと考えられない
0708デフォルトの名無しさん2010/04/28(水) 14:27:11
>>703
WindowsSDKツールのV6.0A V6.1の両方ともWpfPerf アプリケーションが入ってません
どのSDKですか?
0709デフォルトの名無しさん2010/04/28(水) 14:30:10
ブラウザアプリでファイルにアクセスできないと何も出来なくないですか
同一サーバー上のファイルにアクセスするにはどうすればいいんですか
0710デフォルトの名無しさん2010/04/28(水) 15:39:52
>>709
下手に許すとローカルのファイルをいじり放題。その気になればスパイウェアも仕込み放題ということになってしまうから、それはできないことになってる
0711デフォルトの名無しさん2010/04/28(水) 16:12:42
>635で質問したものだが、こういう風にすることでとりあえず解決した
http://ideone.com/OemER
0712デフォルトの名無しさん2010/04/28(水) 19:15:20
>>708
V6.0 か V7.0。
以前は単体でもダウンロードできたけど、今は出来ないみたい。
(http://windowsclient.net/wpf/perf/wpf-perf-tool.aspx ;の previous version of WpfPerf)。
SDK を入れるなら Win32 Development Tools だけ入れればいい。
0713デフォルトの名無しさん2010/04/28(水) 20:57:54
XAML:<ListBox ItemsSource="Binding ."/>
結果:
B
i
n
d
i
n
g

.

あぁそうか…stringもIEnumerableだったな…  ってこんなんアリなのかw
0714デフォルトの名無しさん2010/04/28(水) 23:35:19
ちょっとワロタw
0715デフォルトの名無しさん2010/04/29(木) 11:29:33
>>712
できたありがとう
ハードウェアレンダー 1 になってた
サンプルサイト見てるとカクカクだから絶対CPUレンダーだと思ったのに・・・
0716デフォルトの名無しさん2010/04/29(木) 17:32:32
Shazzam(WPF/Silverlight用のシェーダエディタ)良いね
シンプルだけどWPFやSilverlightのシェーダ書くのには十分
C#側のコードを自動生成してくれる
WPFの見本みたいなかっこいいインターフェイス
0717デフォルトの名無しさん2010/04/29(木) 19:15:45
WPF入門者用のサイトいくつか教えてくれ
0718デフォルトの名無しさん2010/04/29(木) 19:20:07
ゲームパッド使えるの?
0719デフォルトの名無しさん2010/04/29(木) 19:25:12
>>718
XNA+WPFでいけ
http://sorceryforce.com/xna/tips_xnaonwpf.html
0720デフォルトの名無しさん2010/04/29(木) 19:28:45
>>717
ここだなあ
http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_01/uiframework_01_01.html

WinFormで動的にコントロール追加したりオーナードローとかやったことある人なら
それほど違和感なくやれると思うがこれからって人は2010のマウスでデザインできる
ってを利用した方がいいかもね〜
0721デフォルトの名無しさん2010/04/29(木) 22:40:11
XNAだとXBOX用コントローラしか使えない
DirectXは参照できたからそっちで攻めるしかないんじゃない
0722デフォルトの名無しさん2010/04/29(木) 22:50:42
>>721
PS2パッドも使えるわ
適当なこと言うな
0723デフォルトの名無しさん2010/04/29(木) 22:54:59
>>723
使えねえよ
07247232010/04/29(木) 22:57:13
>>722
つ、使えないと思います
0725デフォルトの名無しさん2010/04/29(木) 22:58:27
訂正来てよかったぜ
どう突っ込んでいいか悩んだぜ
0726デフォルトの名無しさん2010/04/29(木) 22:58:49
いやいや現に使ってるしw
なにいってんの?
0727デフォルトの名無しさん2010/04/29(木) 23:01:09
もしかしたら古いコンバーター使っているんじゃないのか?
1年前に買った奴だと普通に使えたわ
0728デフォルトの名無しさん2010/04/29(木) 23:40:58
>>726
そういうのもう良いから。

しかし DirectInput に未対応なのはなんでなんだろね。
0729デフォルトの名無しさん2010/04/29(木) 23:45:29
XNA+DirectXならXBOXコン以外使える
WPF+XNAならXBOXコンしか使えない
■ このスレッドは過去ログ倉庫に格納されています