質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

2592閲覧

VS CodeでWPFを使用してみましたが、ボタンが表示されません

Wind

総合スコア442

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2020/12/24 06:24

前提・実現したいこと

VS Codeを使用して、簡単なWPFアプリを作成したいです。

発生している問題・エラーメッセージ

.NET Core 3.0とVSCodeでデスクトップアプリ(ランチャー)の手順に従って実行したところ、空の画面が表示されてボタンが表示されませんでした。
エラーメッセージも表示されていません。

該当のソースコード

ほぼ参照元のコピペですが、FromArgbがインテリセンスでも表示されるのに実行時に何故かUnknownとなるので、FromRgbに変更して最初の0xff,を消して実行時にNo problemsになるようにしました。
Pathのフォルダとファイルは同一名で作成してあります。
SDKは最初から.NET Core 3.1を入れ、dotnet --version3.1.404と表示されることを確認しました。

※teratailの文字数制限にひっかかったので、コピペ後に一部コメントを削除しました。

Xaml

1<Window x:Class="WrapLauncher.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WrapLauncher" 7 mc:Ignorable="d" 8 Title="ランチャー" Height="450" Width="800" ResizeMode="CanResizeWithGrip" 9 Loaded="Window_Loaded"> 10 <Window.Resources> 11 <!-- 起動ボタンのスタイル --> 12 <Style TargetType="Button"> 13 <Setter Property="Margin" Value="5"/> 14 <Setter Property="Padding" Value="3"/> 15 </Style> 16 <!-- 見出しラベルのスタイル --> 17 <Style x:Key="TitleLabel" TargetType="TextBlock"> 18 <Setter Property="Margin" Value="5,10,5,0"/> 19 <Setter Property="FontWeight" Value="Bold"/> 20 <Setter Property="Foreground" Value="DarkBlue"/> 21 </Style> 22 23 <!-- コンテキストメニュー --> 24 <ContextMenu x:Key="CtxMenu"> 25 <MenuItem Header="設定再読み込み(_R)" Click="MenuReload_Click"/> 26 <Separator /> 27 <MenuItem Header="ヘルプ(_H)" Click="MenuHelp_Click"/> 28 </ContextMenu> 29 </Window.Resources> 30 31 <!-- この中にボタン等を追加していく --> 32 <StackPanel x:Name="mainContainer" /> 33</Window>

C#

1using System.Windows; 2using System.Windows.Controls; 3using System.Collections.Generic; 4using System.Windows.Media; 5 6namespace WrapLauncher 7{ 8 /// <summary> 9 /// Interaction logic for MainWindow.xaml 10 /// </summary> 11 public partial class MainWindow : Window 12 { 13 // パスファイル(BOMなしUTF8) 14 private const string ConfigFileName = "WrapLauncher.path"; 15 // 見出しテキストのカラム位置 16 private const int IdxTitle = 0; 17 // 色記号のカラム位置 18 private const int IdxColor = 0; 19 // ボタンテキストのカラム位置 20 private const int IdxBtnText = 1; 21 // 起動フォルダパスのカラム位置 22 private const int IdxLaunchPath = 2; 23 24 // 色テーブル 25 private static readonly Dictionary<string, SolidColorBrush>ColorTable = new Dictionary<string, SolidColorBrush> 26 { 27 { "bla", new SolidColorBrush(Color.FromRgb( 0x00, 0x00, 0x00)) }, 28 { "gra", new SolidColorBrush(Color.FromRgb( 0x80, 0x80, 0x80)) }, 29 { "yel", new SolidColorBrush(Color.FromRgb( 0xff, 0xd7, 0x00)) }, 30 { "gre", new SolidColorBrush(Color.FromRgb( 0x00, 0x80, 0x00)) }, 31 { "blu", new SolidColorBrush(Color.FromRgb( 0x00, 0x00, 0xff)) }, 32 { "sky", new SolidColorBrush(Color.FromRgb( 0x87, 0xce, 0xeb)) }, 33 { "red", new SolidColorBrush(Color.FromRgb( 0xff, 0x00, 0x00)) }, 34 { "ora", new SolidColorBrush(Color.FromRgb( 0xff, 0x8c, 0x00)) }, 35 { "pur", new SolidColorBrush(Color.FromRgb( 0x80, 0x00, 0x80)) }, 36 { "whi", new SolidColorBrush(Color.FromRgb( 0xff, 0xff, 0xff)) }, 37 }; 38 39 // ヘルプテキスト 40 private const string HelpText = @"省略"; 41 42 public MainWindow() 43 { 44 InitializeComponent(); 45 // コンテキストメニュー設定 46 this.ContextMenu = (ContextMenu)(this.Resources["CtxMenu"]); 47 } 48 private void Window_Loaded(object sender, RoutedEventArgs e) 49 { 50 // 設定読み込み、画面に反映 51 LoadConfig(); 52 } 53 private void MenuReload_Click(object sender, RoutedEventArgs e) 54 { 55 // 画面クリア 56 mainContainer.Children.Clear(); 57 58 // 設定読み込み、画面に反映 59 LoadConfig(); 60 } 61 private void MenuHelp_Click(object sender, RoutedEventArgs e) 62 { 63 MessageBox.Show(HelpText); 64 } 65 66 /// <summary> 67 /// 設定読み込み、画面に反映 68 /// </summary> 69 private void LoadConfig() 70 { 71 // 設定ファイルのフルパス取得 72 string cfgFilePath = GetConfigFilePath(); 73 74 // 設定ファイルが見つからなければ終了 75 if (string.IsNullOrEmpty(cfgFilePath)) 76 { 77 return; 78 } 79 80 // 設定ファイル読み込み 81 using (var reader = new System.IO.StreamReader(cfgFilePath)) 82 { 83 WrapPanel btnContainer = null; 84 85 while (!reader.EndOfStream) 86 { 87 // TABで分解 88 var item = reader.ReadLine().Split('\t'); 89 if (item.Length < 1) 90 { 91 // データなしの行 92 continue; 93 } 94 95 // グループ作成するローカル関数 96 void MakeGroup(ref WrapPanel btnContainer, string grpTitle = "") 97 { 98 // グループコンテナ作成 99 var grpContainer = new StackPanel(); 100 // グループコンテナをメインコンテナに追加 101 mainContainer.Children.Add(grpContainer); 102 103 if (string.IsNullOrEmpty(grpTitle) == false) 104 { 105 // 見出し作成 106 var txt = new TextBlock(); 107 txt.Style = (Style)(this.Resources["TitleLabel"]); 108 txt.Text = grpTitle; 109 // 見出しをグループコンテナに追加 110 grpContainer.Children.Add(txt); 111 } 112 113 // ボタンコンテナを作成 114 btnContainer = new WrapPanel(); 115 // ボタンコンテナをグループコンテナに追加 116 grpContainer.Children.Add(btnContainer); 117 } 118 119 if (item[IdxTitle].StartsWith("//")) 120 { 121 // 見出し 122 123 // グループ作成 124 MakeGroup(ref btnContainer, item[IdxTitle].Substring(2)); 125 } 126 else if (item.Length == 3) 127 { 128 // ボタン 129 130 // まだボタンコンテナが作成されていない? 131 if (btnContainer == null) 132 { 133 // グループ作成(見出し無し) 134 MakeGroup(ref btnContainer); 135 } 136 137 // ボタン作成 138 var btn = new Button(); 139 SetButtonProperty(ref btn, item[IdxColor], item[IdxBtnText], item[IdxLaunchPath]); 140 // ボタンコンテナにボタンを追加 141 btnContainer.Children.Add(btn); 142 } 143 } 144 } 145 } 146 147 /// <summary> 148 /// ボタン属性設定 149 /// </summary> 150 /// <param name="btn">ボタンオブジェクト</param> 151 /// <param name="colorKey">色</param> 152 /// <param name="text">ボタンテキスト</param> 153 /// <param name="execute">起動プログラムのファイルパス</param> 154 private void SetButtonProperty(ref Button btn, string colorKey, string text, string execute) 155 { 156 var txtContainer = new StackPanel(); 157 txtContainer.Orientation = Orientation.Horizontal; 158 // ■テキスト作成 159 var txtMark = new TextBlock(); 160 txtMark.Text = "■"; 161 txtMark.Margin = new Thickness(0,0,2,0); 162 163 // 色指定が有効なら■の色を変える 164 if (ColorTable.ContainsKey(colorKey)) 165 { 166 txtMark.Foreground = ColorTable[colorKey]; 167 } 168 txtContainer.Children.Add(txtMark); 169 170 // ボタン名テキスト作成 171 var txt = new TextBlock(); 172 txt.Text = text; 173 txtContainer.Children.Add(txt); 174 175 // ボタンテキスト設定 176 btn.Content = txtContainer; 177 // ボタンクリック時の処理 178 btn.Click += (sender, e) => 179 { 180 var p = new System.Diagnostics.Process(); 181 p.StartInfo.FileName = execute; 182 p.StartInfo.UseShellExecute = true; 183 p.Start(); 184 }; 185 } 186 187 /// <summary> 188 /// 設定ファイルパス取得 189 /// </summary> 190 /// <returns>設定ファイルのフルパス。存在しない場合は空文字列を返す。</returns> 191 private string GetConfigFilePath() 192 { 193 // EXEのパス取得 194 string appPath = System.IO.Path.GetDirectoryName( 195 System.Reflection.Assembly.GetExecutingAssembly().Location); 196 // 設定ファイルのフルパス組み立て 197 string cfgFilePath = System.IO.Path.Combine(appPath, ConfigFileName); 198 199 // 設定ファイル存在チェック 200 if (System.IO.File.Exists(cfgFilePath)) 201 { 202 return cfgFilePath; 203 } 204 else 205 { 206 // 設定ファイルなし 207 return string.Empty; 208 } 209 } 210 } 211}

path

1//フォルダ 2yel Test C:\Test 3//ドキュメント 4gre Excel1 c:\Test\book1.xlsx 5sky Word1 c:\Test\word1.docx

###試したこと
pathファイルをUTF-8でReOpenしました。
pathファイルに半角スペース等が無いことを確認しました。
UTF-8 with BOMは選択出来無い入っていないことを確認しました。

補足情報(FW/ツールのバージョンなど)

Windows10
VS Code 1.52.1
.NET Core 3.1.404

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/12/24 06:35

LoadConfig 内にブレークポイントを張って、ボタンが作成されているかどうかステップ実行で確かめてみたらどうでしょうか。
TN8001

2020/12/24 10:46

記事通りにやれば、表示されることを確認しました。 「フォルダ」等の見出しも出なく真っ白な場合は、設定ファイル`WrapLauncher.path`がないか保存場所が違います。 見出しは出るがボタンが出ない場合は、設定ファイルの書式が間違っています。
Wind

2020/12/25 00:16

お二人ともアドバイスありがとうございます。 統合環境使用時のクセで「記述→実行」としていた為、`WrapLauncher.path`が保存されず中身が空白のまま実行されていました。 非常に恥ずかしい原因でしたが、ありがとうございます。
guest

回答1

0

自己解決

アドバイスのお陰で解決しました。
統合環境使用時のクセで「記述→実行」としていた為、WrapLauncher.pathが保存されず中身が空白のまま実行されていました。
本当に初歩的なことですが、WrapLauncher.pathをSaveしたところ解決しました。

投稿2020/12/25 00:19

編集2020/12/25 00:20
Wind

総合スコア442

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問