WPF(.NET, WinUI) GUIプログラミング Part32
WPF(Windows Presentation Foundation)について語るスレ。
前スレ
WPF(.NET, WinUI) GUIプログラミング Part31
https://mevius.5ch.net/test/read.cgi/tech/1674334396/
関連スレ
Windows 10 UWPアプリ開発Part 3
https://mevius.5ch.net/test/read.cgi/tech/1627556967/
コードを貼る場合は以下のサイトの利用をお勧め。
https://ideone.com/ 残念なのは再びネイティブ有利の社会が来ることはないと言うこと winformsって誰でも簡単にGUIが組めるという点で他の言語も含めて未だに手軽さで上回るフレームワークはないんじゃない?
廃れるのは惜しいと思ってるので機能強化してくれ - PCでもスマホでもWebでも(ほぼ)同じ体験ができる
- 直感的なステート管理
- UIスレッドとバックグラウンドスレッドの処理分けが簡単にできる
- まともなスケーリング、レスポンシブ対応
- モダンな見た目のUI、コントロールが充実している
こういうフレームワーク要件が業務アプリですら当たり前になってきてるのに
今さらwinformsで作る気にはとてもなれないわ
100歩譲って、
C#初心者がで最初のGUIアプリ作る程度の規模なら選択肢の一つに入るかもしれんけど、
10年前ならともかく、先のないwinformsで今それやる必要ある?って感じ でもWPF以降のフレームワークって普及してないよね >- PCでもスマホでもWebでも(ほぼ)同じ体験ができる
ネイティブアプリに同じ体験を求めるのは間違い
Webアプリの体験で十分なら運用コストが高くつくネイティブアプリをわざわざ作る必要はない
>- 直感的なステート管理
これは開発者の技量次第
winformsでもviewとmodelをきちんと分離してやればいいだけで他のフレームワークでも同じこと
>- UIスレッドとバックグラウンドスレッドの処理分けが簡単にできる
簡単にできるやろ
winformsだとできないと思ってる意味がわからん
>- まともなスケーリング、レスポンシブ対応
これは確かに今のwinformsでは無理
>- モダンな見た目のUI、コントロールが充実している
サードパーティのコントロール使えばいいよ
ってことで問題は4番目だけ
スケーリング・レスポンシブ非対応でもお手軽さが優先されるなら全然あり >>264
そこがなぁ。
最近のノートは高分解能パネルだし。
125とか150%がデフォだよ。 基本的にWinForms使いの技量は低いという認識です
ViewとかModelとか言われても困惑すると思います >>266
マジかよ!!
そんなに技量の低い人たちにも使わせることができるって凄いメリットじゃん
スケーリング捨てても開発費が格段に安上がりになるんだから依然有力な選択肢だな winformsはバカを隔離するためのフレームワークだから無いと困る WPFUIはバグだらけってあるけど大丈夫かなぁ
WPFは比較的高い品質たもってるから維持してほしいわ 細々とWPFは続くんだろうな
後10~20年もしたら自分らは抜けていくからその頃に無くなるんだろうな 5年経ってもWinUIとMAUIは現存のバグすら修正されず開発者に見限られてるよ >>273
君はやたら攻撃的だけど、具体的にどのバグが問題なのかな?
流石に1年経って安定していると思えるが バグの存在しない環境は存在しないが
君はandroidとか他の環境のアプリ作った事あるのか?
よほどの事がない限りユーザーも多いのもあるから
バグを自ら報告するはめにもならんし全然品質が違うんだけど >>275
誰に言ってるのかも結局何が言いたいのかもよくわからんレス UWPのこともたまには思い出してあげてください
Windows 10 UWPアプリ開発Part 3 [無断転載禁止]
https://mevius.5ch.net/test/read.cgi/tech/1627556967/ 人間の使える時間は有限
その時間をUWP学習や開発に割くなんて… XamlスキーマはUWP(WinUI2)とWinUI3で共通なんだからWinUI3のドキュメント不足とか表面的なんだよな
UWP期間なしでReunionになってればとつくづく思うけど AppContainerはなんとなく安心感があるから最初から選択制なら良い構想だったとは思う ListBoxで質問です。
アイテム数が500個くらいになると最初の表示が数秒かかります。
データを遅延ロードさせると良いのだが、TabControlに貼り付けているのでタブが選択されていないと切り替えた時点で数秒かかります。
何か良い方法ありますか? >>282
<ListBox.Template>
<ControlTemplate>
<ScrollViewer VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling">
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</ListBox.Template>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel> >>283
ありがとうございます。
明日試して報告します。 >>283
ところで
VirtualizingStackPanel.VirtualizationModeは使っていますが、ControlTemplateのところが肝なんですか? >>285
それでも多分大丈夫。
ItemsPanelTemplate が重要で、これを VirtualizingStackPanel に変えてやらないと仮想化されない avaloniaのドッキングライブラリの
ライセンスがGNU afferoに変更されてるな
ただコミット履歴見ると元に戻す? >>286
こんな感じですが、初回表示の数秒待ちは変わりませんでした。
親Gridの1区画をTabControlで使い、その中にGridを切って、ListBoxの16個の要素を揃えて展開します。
<UserControl.Resources>
<ItemsPanelTemplate x:Key="ListBoxItemTemplate">
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
<DataTemplate x:Key="TestDataTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*" />
途中省略
<ColumnDefinition Width="3*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Data0}" />
<ComboBox Grid.Column="1" ItemsSource="{Binding Data1}" />
途中省略
<TextBox Grid.Column="15" Text="{Binding Data15}" />
</Grid>
</DataTemplate>
</UserControl.Resources>
<Grid DockPanel.Dock="Top">
<ListBox x:Name="PointDataListBox" Margin="0,0,0,0"
ItemsPanel="{DynamicResource ListBoxItemTemplate}"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling">
<ListBox.ItemTemplateSelector>
<local:ListBoxTestDataTemplateSelector TestDataTemplate="{StaticResource TestDataTemplate}"/>
</ListBox.ItemTemplateSelector>
</ListBox>
</Grid>
最初はDataGridで設計していましたが、TextBoxの各種イベントを使いたく、私の能力では困難でListBoxに代えました。 >>288
TabControl はタブが切り替わるたびにコンテンツの Load と Unload が行われちゃうから、
見た目がタブでなくても良いならラジオボタンで表示を切り替えるようにするとか?
↓こんなイメージ
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibility" />
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<RadioButton x:Name="Page1" Content="Page1" />
<RadioButton x:Name="Page2" Content="Page2" />
<RadioButton x:Name="Page3" Content="Page3" />
</StackPanel>
<Grid Grid.Row="1" Visibility="{Binding IsChecked, ElementName=Page1, Converter={StaticResource BooleanToVisibility}}">
<TextBlock Text="Page1" />
</Grid>
<Grid Grid.Row="1" Visibility="{Binding IsChecked, ElementName=Page2, Converter={StaticResource BooleanToVisibility}}">
<TextBlock Text="Page2" />
</Grid>
<Grid Grid.Row="1" Visibility="{Binding IsChecked, ElementName=Page3, Converter={StaticResource BooleanToVisibility}}">
<TextBlock Text="Page3" />
</Grid>
</Grid>
見た目が TabControl じゃないとだめならそれっぽく調整するか、
↓の回答にあるような TabControl を継承したカスタムコントロールを作るか。
https://stackoverflow.com/questions/2193166/how-do-i-prerender-the-controls-on-a-tabitem-in-wpf >>289
建設的なご意見ありがとうございます。
TabControlじゃなくてもOKです。
画面切り替えしてデザイナーで確認できるので便利と思っていた程度でユーザーコントロールにしてからは個別でデザイナーで確認しているので問題ないです。
タブのHeaderも表示させてなくて、タブの切替は別のListBoxを選択でしたのでラジオボタン部は不要です。
この場合で非表示状態(タブで隠れていたListBox)から表示に切り替わった時には既にレンダリングは終わっているのでしょうか?
やってみればわかるのですが、ちょっと改造に時間がかかるので報告が遅れそうです。 視覚的なレンダリングという意味なら、非表示なので当然レンダリングはされないけど、
非表示状態であっても VisualTree 上には存在していてロードされている。
TabControl の場合は、未選択のタブは単に非表示になっているわけではなく VisualTree からも削除(アンロード)されるので再度タブが選択されたときはロードからやり直し、みたいな感じ そういやあの5chブラウザ
リポジトリごと消えてるよな >>291
すみません、今日は別件でやれなかったです。
TabControlだと最初の選択で数秒かかり(これがレンダリングかと思ってた)、別のタブを選んで戻ってきた場合は瞬時に現れます。なのでロードされっぱなしと思っています。キャッシュみたいな動作です。 ウィンドウを前回開いたサイズや位置で開くような機能ってテンプレートで実装してあってもいい気がする >>295
画面構成の変更(含むスケーリング変更、多画面、リモートデスクトップ)も含めてちゃんと対応するのが面倒だよ
対応しないのも潔いかと ちょっと試してみたらTemplete Studioで実装されてました DataGridでItemSource="{Binding x}"じゃなくて{Binding}とは何ですか?
何をBindingするのですか? 上の階層のDataContextをそのまま指定する場合の省略した書き方 >>302
ありがとうございます。
コードでbindingする場合は不要ですね。 DataGridのGotMouseCaptureでセル選択を記録していて、セルを選択してからDataGridのスクロールバーを操作するとセルを選択してないのに同じイベントが発生します。
以下のコードです。
void hoge_GotMouseCapture(object sender, MouseEventArgs e) {
var datagrid = sender as System.Windows.Controls.DataGrid;
var cell = (System.Windows.Controls.DataGrid)e.Source as System.Windows.Controls.DataGrid;
if (datagrid == null || cell == null) return;
TestData param = (TestData)cell.CurrentItem as TestData;
if (param == null) return;
int column = cell.CurrentColumn.DisplayIndex;
セルじゃない場所はcolumn行までにreturnして欲しいのだが、こんなコードは駄目ですか? >>304
mousedownイベントからセルの行と列を見つける記事を見つけて目的達成しました。 教えてちょうだい。
<DataGrid FontSize=”24”>で定義している表ですが、DataGridTextColumnの列は24サイズで表示されますが、DataGridComboBoxColumnの列は反映す、デフォルト(12)のままです。
ぐぐっても見つからないのでお願いします。 >>308
すみません。解決しました。
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="TextElement.FontSize" Value="24"/>
</Style>
</DataGridComboBoxColumn.ElementStyle> あれ? Windows11では、WPFでUwpDesktopのContract取れなくなった?
Windows10から11にグレードアップすれば大丈夫のようだが、Windows11直接インストールはペケだね。
これは、周辺デバイス使うのに、いよいよWinUI3に移行しかないかもしれんね。 まあ普通に「何言ってんだこいつ?」と書くと検索して何かを発見するのだろうか? 質問文を書いている内に思考が整理されて、そのまま自己解決したり検索キーワード思いついたりすることあるよね もしかしてUwpDesktopをMicrosoft.Windows.SDK.Contractsに置き換えれば済んじゃう話かな reunionとか結局迷惑なだけだったな
c++開発者救おうとして.netユーザーも死亡とか笑えない
最初からWPFのwin11theme対応や素直にUWPアップグレードしときゃよかったのに reunionは名前を変えただけで今もメインストリーム(笑) C++/CLI延命してWPF対応もしてたら素直に移行してくれてたんじゃないかなあ >>316
C++使いってクライアントアプリのGUIについてはかなり保守的な傾向があるし、パッケージ開発が中心のため開発の人月市場が小さい
大した金にならないのに延々サポートし続けなきゃいけない面倒な客が増えるだけだよ >>316
C++使いってクライアントアプリのGUIについてはかなり保守的な傾向があるし、パッケージ開発が中心のため開発の人月市場が小さい
スキルはあるから適切に誘導すれば比較的容易に移行してもらえるだろうけど、
大した金にならないのに延々サポートし続けなきゃいけない面倒な客が増えるだけだよ >>316
C++使いってクライアントアプリのGUIについてはかなり保守的な傾向があるし、パッケージ開発が中心のため開発の人月市場が小さい
大した金にならないのに延々サポートし続けなきゃいけない面倒な客が増えるだけだよ >>316
C++使いってクライアントアプリのGUIについてはかなり保守的な傾向があるし、パッケージ開発が中心のため開発の人月市場が小さい
大した金にならないのに延々サポートし続けなきゃいけない面倒な客が増えるだけだよ 未だにMFC使うのはwinformのc#を知らないMFCおじさんなんだろう。
と自分のことを棚上げする奴 あの大量の引数だらけのAPIで開発できるのすごいわ C++/CLIの梯子外されたから仕方なくC++使いはMFC使い続ける >>323
逆にWinformsで開発してるとMFCが分からないだろ? >>326
MFCは3年前に足洗ったからもう見たくもないわ。 XAMLのステップ数を数えてくれるフリーソフトってありますか? >>330
その仕事かプロジェクトは辞めたほうがいいと思う >>331
XAMLはステップ対象にならないって事? ステップ…
無駄なstackpanelの入れ子を1000個ぐらい入れたらどうなるの? 実装の早い奴と評価され仕事が増やされる
その後無駄実装がバレて減給
仕事は増えたまま 日立とかの大規模プロジェクトじゃまだステップ数で管理してんのか?笑 拝承はステップ数報告しないと品証部が承認しないとか言ってたな 10年ぐらいWindowsの世界から離れてるんだけど、
10年前はFormもWPFもメンテナンスモード状態で
ストアアプリは低機能過ぎて論外、ということで
UIに決定的な選択肢が存在しない状態だったと思うけど、
ひょっとして今もまだそのグダグダ状態が継続してるの?
あいかわらずMSはUIに関して何のロードマップも示しておらず、
WPFが消極的に第一選択って状態? 追加質問
今確認したらMVVMのスレがなくなってるみたいだけど、
今もMVVMは推奨されてるの?あるいはオワコン化?
個人的にはMVVMには疑問しか感じなかったのでオワコン化してくれてると嬉しい >>333
それはよくわからない。。
同じマークアップ言語でいうと html とか css とかはどうしてるの?
俺が言ってるのは今どきステップ数を指標に用いるような体制だと、
そのこと以外でも今後色々と時代遅れなことをやらされるんじゃないかなという老婆心。
DRYを無視したコピペプログラマの方が、
最小限のコードでメンテしやすいコードを書いた人より生産性が高いと評価される、
みたいなことが起こり得る。
実体験。 >>341
各自、好きなもので勝手にやってくれという感じ。
全く力を入れてない。 >>341
MSとしては今は一応WinUI3推しなのかな
後にはMAUIも控えてる
が、完成度がお察しなの相変わらずで状況は変わってない
>>342
そういえばMVVMの次はMVUだなんて言ってたけど最近あまり聞かないな
MVVMは割と出来の良いToolkitがやっと出てきて若干作りやすくなった >>341
ストアアプリの後継のUWPが開発者に不評でwindowsの先進機能を利用できる唯一のwinRT APIが宙に浮いてた
Win32やWPFやWinFormsからストレートに利用できない
んで別れてしまった物をつなごうとリユニオンと言うプロジェクトが始まって相互利用しやすい状況を作りましょうということに
今はそれが名前を変えてWindows App SDKと言う巨大なSDKの枠組みになった
でも皆が思ったものとはかなり違うものなんじゃないかと
その一方でネイティブからもいろいろ先進GUIを利用しやすいようにとWinUI3と言う新フレームワークも作られた
これが非常に出来が悪いので積極的に利用しづらい状態
生殺し
MVVMは原理主義者が減ったように見える
UWPの時点でMSのサンプルやスケルトンもMVVMは意識されてないものが多かったし
MVVMのフレームワークもMS外に出された >>343
一週掛けて遂にバラメーターで変更だけで済む方法を発見しました!より
汚いコードを大量生産する方が評価されるようなプロジェクトは辛いよ >>346
MVVMは何度も言っているように
最初からblandの為のフレームワークですから winformsでいいじゃん派だったけどwinforms製のService Bus Explorerってツール使ってみて、これはダセぇと思った
やっぱwinformsあかんわ
electron製のStorage Explorerと比較してデザイン雲泥の差 いつまでたってもMVVMが流行らないのはそれ自体というよりXAMLの難解さが原因だと思う
あとはReactivePropertyとかPrismあたり使いだすと更に必要な知識が増えるし
まともにMVVM出来るようになるまでの敷居が高杉 みなさんリプ感謝
どうも相変わらず決定打の選択肢が存在しない状況みたいですね。
先日経済ニュースでMSの一番の稼ぎ頭はAzure関連になってるって聞いたから、
もうデスクトップにはあまり投資する気がないのかもしれないですね >>343
もちろんステップ数が多ければいいって訳じゃないけども、
変化があったら何か理由があって修正したはずってのを管理したいだけなのです >>355
今どきはそういうのはgitとかでやるもんじゃないの? >>351
CommunityToolkit.Mvvm(旧Microsoft.Toolkit.Mvvm)がもっと早く出ていればな
Prismは必要以上に肥大化して複雑になり過ぎた 何がしたいのかいまいちわからないけどワークスペースのライン数数えたいなら今はcloc一択じゃないかな 1.5は大型アップデートのようだな
開発体制変更でだいぶ変わったんだろうか