ユーザ用ツール

サイト用ツール


it技術:dotnet:wpf開発

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
it技術:dotnet:wpf開発 [2017/10/30 18:01] – [WPFとは] yajuadminit技術:dotnet:wpf開発 [2018/01/17 18:19] (現在) – [Shownイベント] yajuadmin
行 8: 行 8:
   * [[https://techinfoofmicrosofttech.osscons.jp/index.php?WPF|WPF - マイクロソフト系技術情報 Wiki]]   * [[https://techinfoofmicrosofttech.osscons.jp/index.php?WPF|WPF - マイクロソフト系技術情報 Wiki]]
   * [[http://www.kanazawa-net.ne.jp/~pmansato/wpf/wpf_base.htm|WPF の基礎知識]]   * [[http://www.kanazawa-net.ne.jp/~pmansato/wpf/wpf_base.htm|WPF の基礎知識]]
- 
  
 ===== Windows Formsとの違い ===== ===== Windows Formsとの違い =====
行 49: 行 48:
 </code> </code>
  
 +==== TextBlockとLabelの違い ====
 +TextBlockは文字列のみを表示することができます。一方でLabelの方はContentに与えられる全てのオブジェクトに対応することができます。\\
 +[[http://neareal.net/index.php?Programming%2F.NetFramework%2FWPF%2FTextBlock%20TextBox%20Label|TextBlockとLabelの違い]]
 +
 +==== 一つの文字列に複数のデータをバインディングしたい場合 ====
 +マルチバインディングを使う。\\
 +[[https://qiita.com/koara-local/items/815eb5146b3ddc48a8c3|[WPF] XAMLでの文字列のフォーマット指定とバインディング]]
 +
 +<code xml>
 +<TextBlock>
 +    <TextBlock.Text>
 +        <MultiBinding StringFormat="{}First {0} : Second {1}">
 +            <Binding Path="FirstValue"/>
 +            <Binding Path="SecondValue"/>
 +        </MultiBinding>
 +    </TextBlock.Text>
 +</TextBlock>
 +</code>
 +バインディングするデータが最初に来る場合は、頭に {} を付ける必要があります。(属性値のBindingなどではなく文字として中括弧がつかいたいため)
 ==== スクロールバーのサイズ取得 ==== ==== スクロールバーのサイズ取得 ====
 ListViewのスクロールバーのサイズを取得する。\\ ListViewのスクロールバーのサイズを取得する。\\
行 64: 行 82:
 [[https://garafu.blogspot.jp/2015/06/dev-tasktray-residentapplication.html|C# WPFでタスクトレイ常駐アプリの開発]] [[https://garafu.blogspot.jp/2015/06/dev-tasktray-residentapplication.html|C# WPFでタスクトレイ常駐アプリの開発]]
  
 +==== ファイル監視で画面表示 ====
 +ファイル監視イベントで画面表示処理を呼び出すと「呼び出しスレッドは、多数の UI コンポーネントが必要としているため、STA である必要があります。」が発生する。\\
 +[[http://code.i-harness.com/ja/q/238d7a|wpf - 多くのUIコンポーネントがこれを必要とするため、呼び出しスレッドはSTAでなければなりません]]
 +
 +UIスレッドで動作させために、下記内で画面表示処理を呼び出す。
 +<code csharp>
 +Application.Current.Dispatcher.Invoke((Action)delegate
 +</code>
 +
 +<code csharp sample>
 +private void watcher_Changed(Object source, FileSystemEventArgs e)
 +{
 +    switch (e.ChangeType)
 +    {
 +        case WatcherChangeTypes.Changed:
 +        case WatcherChangeTypes.Created:
 +            Application.Current.Dispatcher.Invoke((Action)delegate {
 +                MainWindowShow();
 +            });
 +            break;
 +    }
 +}
 +</code>
 +
 +==== 画面表示時の例外エラー ====
 +例外エラー「'Window が閉じた後で、Visibility の設定や、Show、ShowDialog、およびWindowInteropHelper.EnsureHandl の呼び出しを行うことはできません。」
 +
 +フォームインスタンスを再利用するとでる。
 +  * 他のフォームをnewする
 +  * ShowModalで開く
 +  * そのフォームを閉じる
 +  * new済みなので、再度ShowModalで開く
 +
 +対応方法
 +  * [[https://qiita.com/7of9/items/b6cc4c7a5d407b01ffc9|Visual Studio / WPF > Form > 閉じたウィンドウを再度ShowModal()したとき > Error:System.InvalidOperationException: 'Window が閉じた後で、Visibility の設定や、Show、ShowDialog、およびWindowInteropHelper.EnsureHandl の呼び出しを行うことはできません。 > 対処]]
 +  * [[https://stackoverflow.com/questions/3568233/wpf-cannot-reuse-window-after-it-has-been-closed|WPF: Cannot reuse window after it has been closed]]
 +
 +
 +<code csharp>
 +private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
 +{
 +    e.Cancel = true;
 +    this.Visibility = Visibility.Hidden;
 +}
 +</code>
 +
 +==== Shownイベント ====
 +WPFにはWindowが最初に表示されたときのShownイベントが無いので、代わりにContentRenderedイベントを利用する。\\
 +[[https://qiita.com/tricogimmick/items/79e85baa1e99eec840d8|WPF Windowが最初に表示されたときに処理を行いたい]]
 +==== 表示文字幅の取得 ====
 +画面に表示される文字の幅を取得する。\\
 +[[http://blogs.wankuma.com/hirom/archive/2009/08/05/179828.aspx|WPFで表示文字幅の取得を行う。]]
 +
 +<code csharp sample>
 +Typeface typeface = new Typeface(txtTest.FontFamily, txtTest.FontStyle, txtTest.FontWeight, txtTest.FontStretch);
 +double len = MeasureString("テスト", txtTest.FontSize, typeface).Width;
 +
 +/// <summary>
 +/// 表示文字幅を取得する
 +/// </summary>
 +/// <param name="text"></param>
 +/// <param name="fontSize"></param>
 +/// <param name="typeFace"></param>
 +/// <returns>表示文字サイズ</returns>
 +private Size MeasureString(string text, double fontSize, Typeface typeface)
 +{
 +    var ft = new FormattedText(text, System.Globalization.CultureInfo.CurrentCulture,
 +                               FlowDirection.LeftToRight,
 +                               typeface, fontSize, Brushes.White);
 +
 +    return new Size(ft.Width, ft.Height);
 +}
 +</code>
 +
 +==== Buttonのクリックイベントを発生させる ====
 +WPFには、Windows FormにあったPerformClickメソッドが存在しない。\\
 +IInvokeProviderインターフェースを利用するには、参照の追加の参照マネージャーのアセンブリから「UIAutomationProvider.dll」を参照する。\\
 +[[http://blog.xin9le.net/entry/2013/10/27/195614|ボタンをプログラム側からクリックする]]\\
 +[[http://dobon.net/vb/dotnet/control/performclick.html|Buttonのクリックイベントを発生させる]]
 +
 +==== 最大化を禁止させる ====
 +<code csharp sample>
 +//最小化ボタンは有効、最大化ボタンは表示されてるけど、無効。
 +this.ResizeMode = ResizeMode.CanMinimize;
 +</code>
 +[[http://d.hatena.ne.jp/tako222/20090827/1251379855|WPFでGUIアプリケーションを作成する際のメモ その3]]
 +
 +==== Bindingのソースが更新されない ====
 +ViewModelにINotifyPropertyChangedインターフェイスを実装する必要がある。\\
 +  * [[http://blog.okazuki.jp/entry/2014/09/15/201110|WPF4.5入門 その55 「Binding その1」]]
 +  * [[http://blog.okazuki.jp/entry/20091214/1260803280|INotifyPropertyChangedのいけてる実装]]
 +  * [[http://var.blog.jp/archives/67585928.html|Binding Source が更新されない]]
 +
 +INotifyPropertyChangedを実装はイケてないので、ReactivePropertyを使用する。\\
 +NuGetから「ReactiveProperty 3.6.0」で入手する。
 +
 +  * [[https://qiita.com/ledsun/items/6f4ef754e5ae2507e531|INotifyPropertyChanged実装のありえない面倒くささと、ReactivePropertyの信じられない素晴らしさ]]
 +  * [[http://blog.okazuki.jp/entry/2015/12/05/221154|MVVMをリアクティブプログラミングで快適にReactivePropertyオーバービュー]]
 +
 +==== ListViewの選択背景色を変更する ====
 +=== XAMLでの変更方法 ===
 +[[https://stackoverflow.com/questions/4246795/change-selection-color-of-wpf-listviewitem|Change selection-color of WPF ListViewItem]]
 +
 +<code xml>
 +<ListView.ItemContainerStyle>
 +    <Style TargetType="{x:Type ListViewItem}">
 +        <Style.Triggers>
 +            <Trigger Property="IsMouseOver" Value="True">
 +                <Setter Property="Background" Value="midnightblue" />
 +            </Trigger>
 +        </Style.Triggers>
 +    </Style>
 +</ListView.ItemContainerStyle>
 +</code>
 +
 +=== コードによる変更方法 ===
 +[[https://www.codeproject.com/Articles/29699/WPF-How-to-create-Styles-in-code-and-magical-Conte|WPF: How to create Styles in code/and magical Content]]
 +
 +<code csharp>
 +// 選択時の背景色
 +Style styleListViewItem = new Style(typeof(ListViewItem));
 +Trigger triggerIsMouseOver = new Trigger { Property = ListViewItem.IsMouseOverProperty, Value = true };
 +triggerIsMouseOver.Setters.Add(new Setter(ListViewItem.BackgroundProperty, Brash.Gold)) SolidColorBrush(selectbackColor)));
 +styleListViewItem.Triggers.Add(triggerIsMouseOver);
 +lstRework.ItemContainerStyle = styleListViewItem;
 +</code>
 ==== メモ ==== ==== メモ ====
   * [[https://stackoverflow.com/questions/632519/how-can-i-hide-the-header-of-a-listview-wpf|How can I hide the header of a listview WPF?]]   * [[https://stackoverflow.com/questions/632519/how-can-i-hide-the-header-of-a-listview-wpf|How can I hide the header of a listview WPF?]]
行 73: 行 217:
   * [[http://getbget.seesaa.net/article/436822830.html|WPF - DataGrid のデータ表示部分の背景色を変える]]   * [[http://getbget.seesaa.net/article/436822830.html|WPF - DataGrid のデータ表示部分の背景色を変える]]
   * [[http://hogetan.blog24.fc2.com/blog-entry-7.html|WPFでリサイズ可能な枠なしウィンドウを作成する]]   * [[http://hogetan.blog24.fc2.com/blog-entry-7.html|WPFでリサイズ可能な枠なしウィンドウを作成する]]
 +  * [[http://d.hatena.ne.jp/CoMo/20110421/1303394273|WPFのレイアウトのTips]]
 +  * [[http://sourcechord.hatenablog.com/entry/20131028/1382978042|アプリの多重起動を防止する]]
it技術/dotnet/wpf開発.1509354119.txt.gz · 最終更新: 2017/10/30 18:01 by yajuadmin