前提・実現したいこと
VS Codeを使用して、簡単なWPFアプリを作成したいです。
発生している問題・エラーメッセージ
.NET Core 3.0とVSCodeでデスクトップアプリ(ランチャー)の手順に従って実行したところ、空の画面が表示されてボタンが表示されませんでした。
エラーメッセージも表示されていません。
該当のソースコード
ほぼ参照元のコピペですが、FromArgb
がインテリセンスでも表示されるのに実行時に何故かUnknownとなるので、FromRgb
に変更して最初の0xff,
を消して実行時にNo problemsになるようにしました。
Pathのフォルダとファイルは同一名で作成してあります。
SDKは最初から.NET Core 3.1を入れ、dotnet --version
で3.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
回答1件
あなたの回答
tips
プレビュー