WPF(XAML, XBAP, .NET4.0)GUIプログラミング Part22
■ このスレッドは過去ログ倉庫に格納されています
Windows Presentation Frameworkについて語るスレ。
前スレ
WPF(XAML, XBAP, .NET4.0)GUIプログラミング Part21
http://mevius.2ch.net/test/read.cgi/tech/1494288553/
関連スレ
Windows 10 UWPアプリ開発 Part 2
http://mevius.2ch.net/test/read.cgi/tech/1499658092/
コードを貼る場合は以下のサイトの利用をお勧め。
run codeのチェックは外しておきましょう。
http://ideone.com/ Visual Studio InstallerもElectronで作られる時代 VisualStudio本体もWPFで作られてるというよりWPFを描画と入力に使った独自フレームワークだからね
次のVSは本体にもElectronが入ってくるだろうけど VisualStudioのIDEってサードパーティー製のコントロールを使ってるって以前聞いたけど
本当なのか? MVVMの本質ってModel View ViewModelに分けることであって、
データバインド機能がなくてViewとViewModelを手動で結びつけててもMVVMです?
手動でやるとMVVM以外に結びつけるクラス(コード)が必要ですけど。 >>106
MVVMはバインディングを効果的に利用するためのパターンなので、本来はバインディングを使わないならMVVMとは呼ばない
手動でやるのはMVVMの基になったMVPとかPassive Viewっていうパターンがある >手動でやるのはMVVMの基になったMVPとかPassive Viewっていうパターンがある
WPF発祥の地ということ詳しい人がたくさんいるのはここだと思って
でここで質問したんですが、実際はWPFは関係なくてJavaScriptのWebアプリなんですよね。
で、実際、クラスを設計しようとして、モデルクラスつくって、次にビューモデルクラス作ってと
やってビューのフレームワークは実際React使うですんが、Reactはデータの流れは1方向で
ビューで発生したアクションは手動でビューモデルのメソッドを呼ぶように作ろうとしています。
で、責務的にはMVVMっぽくわけてるんですが、これMVVMって呼んでいいのかなとふと疑問に思ったもので・・ MVPとかPassive Viewとか前にチラッと言葉だけは覚えたんですが、調べてみます。 どうでもいいけど、
WPF発祥の地
は
MVVM発祥の地でした reactならfluxでしょ
少なくともビューとC/P/VMを双方向に同期させないのはデータフロー的にもMVVMとは根本的に異なるよ fluxというかreduxはややこして、今mobx使おうと思ってます。
>ビューとC/P/VMを双方向に同期させない
だからこれを手動で双方向に同期させようとしてるんです。 >MVVMはバインディングを効果的に利用するためのパターンなので、本来はバインディングを使わないならMVVMとは呼ばない
つか、仮にそうだとすると、バインデイングの機能を単に誰が用意するかの話問題になっちゃういますよね??
自分で手動で用意するか、標準で用意されてるか誰か他の人がバインディングライブラリを作ってそれを利用するかの・・
それでMMVMと呼ぶか呼ばないかが決まっちゃう。
うーん。 https://qiita.com/takahirom/items/597c48ece57b4623cdee
ちょっとPassive Viewについて見てみました。おっしゃる通り本質的にはMVVPとデータフローは
同じでビューと(ビューモデルまたはプレゼンター)間がデータバインディングされてるか
されてないかの違いっぽいですね。
そうなると自分のはMVPかな?
クラス名の末尾をViewModelではなくPresenterにしとけばいいかなw >おっしゃる通り本質的にはMVPとMVVMはデータフロー
に修正します。
誤字がひどくてすみません。 今日はComboBoxをちょっとだけ勉強したで
ワイWinFormsではデータセットからポトペタしてたんやけど同じようにできるっぽいんかこれ?助かるわ。
せやけど表示のカスタマイズ方法が馴染みなさすぎてオッサンついていかれへんで データソースからポトペタしたデータグリッドのコンボボックスそのままやと使いもんにならんやんけ
これだけで1週間かかったわ
あったまっがパーン かっそ過疎やな
せやけどXAMLおぼえたらあんまり話すネタないよなこれ 登場しからずっと話題は、普及はまだ? 馬鹿には使えない!! のループだったな。 しかしWindows用のデスクトップアプリを作るとなったとき、現実的な選択肢はこれしかなくないか?
UWPは10用だし、マルチプラットフォームのあれこれはまだ発展途上で、
結局シングルソースじゃなかったり容量が馬鹿でかくなったりするし >>127
容量がおかしいのそれだよ
Electron製で50MB以下のパッケージ見たことない
インスコしたら200MB超えましたなんてのもザラ
ついでにメモリも大食い >>130
ただ、Win10その他の制限が問題ない場合はUWPが良いよ
特に起動が10倍単位で早いってのがね
コンパイルは100倍単位で遅いけどね >その他の制限が問題ない場合はUWPが良いよ
そりゃ、マイナス条件がないならプラスしか残らんのは当たり前だわなw
同様に、WPFの制限が問題ないならWPFが良いし、WinFormsの制限が問題ないならWinFormsが良い。 >>132
Fornsのアドバンテージは人足を集めやすいことで、wpfは特別な制約はなくて強いて言えばGridViewなどが遅いことぐらい
UWPは逆汗が難しいことやパフォーマンス。それとtoolkitが標準で用意されていること
それぞれ使い分け出来たら良いけど、人足集めるのが大変だわなwpfとuwpは メトロUIは業務系ユーザーに不評だから提案する気になれない。 wpfのネイティブコンパイルが出来れば全て解決なんだがなぁ
進んでるのかな せっかくXAML覚えたのに来月からJavaScriptの仕事になってもうたわ
けどワイMS製品で育ったしいつかまた会うやろ。じゃあの・・・ コロコロと違う言語やプラットフォームに技術者をぶち込む企業はさっさと転職したほうがいい。 俺は45過ぎてからC++とGPGPU始めて、50近くになってTypeScriptとSPAやってるとこだわ。 c++の文法ルール自体はそんなに難しくない
自動でメモリ解放してくれるようにもなったし
c++は生まれ変わった
でもライブラリなどがレガシーの塊なので非常に地獄 >>142
CとC++の壁? かなり高いよ。
年齢は関係無い。 C#はすっと頭に入ったけど、C++はなかなか入らないですね
特にMFCというのが昔から苦手で今日まで来てしまった 別にMFCはC++の構成要素じゃないよ
好きなフレームワーク使えばいい だいたいwpfでC++もないやろ
なんでそんな話になってんだ全く 次々からフレームワークが出て習得するのが面倒だよな。PGはそんなに暇じゃないっての。
フレームワークを使い捨てにするMSはアホ。wtfだってまだ使ってんだよ。
というか.netの売りは言語自由だったはずなのにwpfではC++を排除してるのかよ。ほんと嘘つきだな、MSは。 .NETのウリは言語自由って初めて聞いたが
いくつかの言語から選べるってのはよく聞くけど WPFおもろいわ。
仕様拡張も含め、.net core対応キボンヌ 全く。マウンティングするための道具として最高におもしろいわ。 Windows10,VS2017でWPFでWindowChromeちゃんを使って、
Windowのスタイルをカスタマイズしようとしてるんだけど、
タイトルバー高さをSystemParameters.WindowCaptionHeightで取得すると
23が返ってくるんよ。で、これ実際にPhotoshopとかで測定すると、31ぐらいなんだけど、
これって、もしかして72dpiと96dpiの違いで、96/72=1.333...をこの23に掛けてるんかな?
例えば、電卓の右上の[X]ボタンはH:30,W:48なんだけど、
SystemParameters.WindowCaptionButtonWidth=36
SystemParameters.WindowCaptionButtonHeight=22
36 x 1.333...= 47.999999
22 x 1.333...= 29.333333
こういう資料って、公式のどっかに説明あるんでしょうか? >>156
どうもThemeの方にヒントがあるようね。
Firefoxのソースでも、Themeからひろってきてるみたい。 デザイナ画面で、現在作業しているプロジェクトファイルのパスが取得したいのですが、方法ありますでしょうか?
AssemblyやGetCurrentDirectoryを使ってもXDesProcのパスが返ってきて取得できません ComputeFirstItemInViewportIndexAndOffsetがFloorをつかっている件か datagridにおいて、以下のようなキーボード操作はXAMLだけで記述できますでしょうか?
・セルのtab移動を止める
・enterキーで次の行に移動するのを止める(矢印キーのみで移動) DataGridは未完成糞品質のまま開発打ち切られて放置されたままのゴミだから使っちゃダメ
WinFormsのをホストして使うかサードのを買うかListViewでスクラッチするかWPFを捨てよう >>163
行数少なければ十分使えるから、数百行表示させないようにプログラムすればいいだけですね 2ヶ月ちょいjs/javaやったけど
Eclipseはポトペタできへんから面倒くさすぎる
いやワイが知らんだけかもしらんけど
しかしIDE落ちまくるし同期とらんと時々嘘くさい表示しよるし何なんやこれ
隣の席のやつ(javaマン)はWPFやらされててワカランワカランいうてるし
ちゃんと履歴書読んどんのかここの会社逆やろw そう思うんなら便所に落書きするより上司に相談しろ
喜んで入れ替えてくれるだろ
その程度の交渉や調整もできないカスなら何やらせたってダメだし、会社もお前に何も期待しないよ 替わりたくないんやが
ちな会社は赤字垂れ流して潰れそうやでw 嘘みたいな話だけどeclipse大好きっこているんだぞ
一個も共感できないeclipse自慢話してくるよ eclipseはモダンemacs的な開発者のオープンプラットフォームとして、
今でいうVSCodeに近いポジションを占めてたから、そういう面ではわりと根強いファンはいた
今ではJavaはIntelliJに取られemacs的な用途はVSCodeに取られ完全にオワコン GridSplitter を挟んだUIを作成中です
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
...
上記のように Columnの幅を1:3などの割合のまま、
Properties.Settings のメンバに Bind するにはどのようにしたらよいですか?
下記のように書いてみましたが、いくつか問題にぶち当たりました
<ColumnDefinition Width="{Binding Source={x:Static p:Settings.Default}, Path=ColumnSplitterSize, Mode=TwoWay}"/>
・Column の幅を変更して、Settings.Default.Save() しても Settings に反映されない(Settings の他の値の変更は確認済み)
・Settings の要素の型に GridLength を指定した場合、3* などを指定できない(数値かアスタリスクのみ)
・1:3 などの割合を指定したまま、サイズを保存、復元する方法があるのか不明
グリッド幅の保存は基本だと思うので簡易な方法があると思うのですが…… >>173
はい、GridLength 構造体です
Settings の要素の型を GridLength にしても反映されないので質問しました
何か基本的なことを見落としてるような気がします GridLength GridUnitType.Starでぐぐる >>169
マルチプラットフォーム的なのが少なかったんで
選択肢がそこに居ちゃっていたってことじゃないんかな? >>172
1:3なのに、なんでAUTOが入ってるの? 試行錯誤しつつ、あれから冷却期間を入れて試したところ 2番目の問題は設定できるようになりました
>>175
> GridLength GridUnitType.Starでぐぐる
「・Settings の要素の型に GridLength を指定した場合、3* などを指定できない」
ことへのコンストラクタを使ってコードを書くべきというアドバイスかと思います
本当に申し訳無いのですが当方の思い込みが含まれていました
実際に試した値は「1*」で、書き込むと「*」になるため、誤認していました
正しく書き直すと、
プロジェクトの「プロパティ」→「設定」→要素の「型」で
PresentationFramework の System.Windows.GridLength を指定した
ケースでの「値」列の内容について、XAMLで指定できる文字列「1*」を指定できず、
書き込むと「*」になるということです
Settings.Designer.cs での DefaultSettingValueAttribute の引数の文字列です
試しに「3*」を入れたところ、3:3(=1:1)に指定できましたので Settings で初期化はうまくできていましたので、
2番目の問題は解決しました
(「1*」は値として同じ意味の文字列「*」に自動で変換されるみたいです)
XAMLは下記のとおり、
<ColumnDefinition Width="{Binding Source={x:Static p:Settings.Default}, Path=ColumnSplitterLength}"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="3*"/>
ただ、Settings で指定は可能なのですが、Grid.Width プロパティは実際のサイズに連動しておらず、
Mode=TwoWay を追加しても、肝心の1番目、2番目が解決できませんでした
実際のサイズに連動するよう少しずつ調査する予定です
(ActualWidth:double を読み取って、GridLengthのコンストラクタを使って Settingsに保存する?)
>>178
はい、GridSplitter を挟んでGridの列を 1:3 にするXAMLの書き方になってます あああ、typo です
「ただ、Settings で指定は可能なのですが、Grid.Width プロパティは実際のサイズに連動しておらず〜」
ColumnDefinition.Width プロパティの間違いです 175は忘れてください
Value+GridUnitType <--> 文字列 相互変換できてました
フォルダー <UserName>\AppData\Local\<アプリケーション名>
の下のほうの user.configに書き込まれているはず splitterの幅をバリアブルにしている理由はなんなの? 質問させてください。
以下の画像のようにウィンドウの表示がSizeToContentの値によっておかしくなる場合があるのですが、
対策方法など分かる方がいらっしゃれば教えていただけないでしょうか。
https://dotup.org/uploda/dotup.org1526890.png
VSのバージョンは15.6.7、ターゲットフレームワークは4.7.1、
実行環境は Windows 10 で「拡大縮小とレイアウト」の設定は100%です。
XAMLは以下の通りです。どうぞよろしくお願いいたします。
<Window
x:Class="SizeToContentIssue.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Width="213" Height="55"
SizeToContent="Width"><!--←Width を Manual に書き換えると正常に表示される-->
<Grid>
<TextBlock>
<Run Text="{Binding Width, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
x
<Run Text="{Binding Height, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
縦棒が入ったり入らなかったり→
</TextBlock>
</Grid>
</Window> >>184
SizeToContent paints an unwanted border
https://stackoverflow.com/questions/16356507/sizetocontent-paints-an-unwanted-border
<Window UseLayoutRounding="True" />
でとりあえずその線は消えた >>185
レスありがとうございます!私の方でも線が消えることを確認しました。
Webで検索しても答えを見つけられなかったので質問させていただいたのですが、
恥ずかしいことに紹介していただいたページは見落としてしまっていたようです。
何はともあれ、お答えいただきどうもありがとうございました。 >>184-186で自分の検索の不十分さを反省して以前から抱えていた別の問題も改めて検索してみたのですが、
やはり私の力ではどうしようもありませんでした。
立て続けに申し訳ないのですが、こちらについてもお力を貸していただけないでしょうか。
以下のような Binding のマークアップ拡張を作成したところ、
Mode が TwoWay のときは期待通りに動作するものの、
Mode が OneWay だと正しくバインディングできずに困っています。
class MyBindingExtension : MarkupExtension
{
public PropertyPath Path { get; set; }
public BindingMode Mode { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
var service= (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
var target = (DependencyObject)service.TargetObject;
var dp = (DependencyProperty)service.TargetProperty;
BindingOperations.SetBinding(target, dp, new Binding { Path = Path, Mode = Mode });
return target.GetValue(dp);
}
}
(続く) (続き)
原因はほとんど分かっていて、
・Mode が OneWay のとき、ターゲット側が書き換えられるとバインディングがクリアされてしまう
・ProvideValue が呼び出されたあと、その戻り値でターゲット側が書き換えられる
ということだと思うのですが、この問題を解決する良い方法が見つかりません。
苦肉の策として、SetBinding の行を次のように書き換えればとりあえず動作することが確認できています。
// BindingOperations.SetBinding(target, dp, new Binding { Path = Path, Mode = Mode });
Application.Current.Dispatcher.BeginInvoke((Action)(()
=> BindingOperations.SetBinding(target, dp, new Binding { Path = Path, Mode = Mode })));
ただ、バインディングのタイミングがずれてしまうと、
例えば SetBinding してから ClearBinding したつもりが順番が逆転してしまうなど
思わぬバグの原因となりかねないためできれば避けたいと考えています。どうぞよろしくお願いいたします。 Windowsでしか動かない.NET Coreアプリw
一体何の意味があるのか せっかく.NET Coreが盛り上がってきてたところだったのに、水を差すことになりそうで心配だな
Linuxサーバーで運用してる人達からしたら、結局梯子外してWinに誘導するいつものMSがまた正体を現したかと疑念を持たれるよこれ >>193
Windowsにインストールされた.NET Frameworkに縛られなくなる >>194
そもそもWindowsでしか動かなかったもののランタイムが変わるだけだし、corefx自体に追加されるわけじゃない
むしろ.NET Coreの普及を後押しする 実質何も発表なかったこと一緒ってこと?
.NETは完全にWinプラトフォーム環境限定ということでオワコン サーバーサイドはクロスだけど微妙にしか人気ねぇし、Xamarin捨てる勇気なかったのか >>197
どこをどう読んだらそうなるんだよwww .NET Core 3ハWindowsデスクトップアプリをサポートする
https://www.infoq.com/jp/news/2018/05/net-core3-announced
開発者が、既存の.NET Framework for Windowsではなく.NET Coreを使いたい理由はなにか?
それにはいくつかの理由がある。まず、.NET Frameworkとは違い、.NET Coreアプリは完全に独立しており、異なるバージョンの.NET Coreを使用することが可能だ。
.NET Core 3の新しいオプションでは、.NET Coreランタイムと組み合わせて実行できる単一の実行ファイルを生成することが可能だ。
この発表に反応した開発者は、WPFとWinFormsをGitHub上でオープンソース化する可能性について尋ねた。
興味深いことにこの要求は、Lander氏に否定されてはない - Microsoftは将来的にオープンにする可能性がある。
コミュニティの主な望みは、これらをmacOSやLinuxに移植するよりも、Windows用のGUIツールキットの拡張とモダン化である。 ■ このスレッドは過去ログ倉庫に格納されています