###はじめに
いろいろと無駄なソースや美しくないと思いますのでご了承下さい.
そのうえでこのようにすれば「綺麗なソースになるよ!」などのアドバイスも頂けたら嬉しいです.
最終的には総合的なアプリケーションにする予定なのでプラグイン化(できるかは別として)する予定です.
前提・実現したいこと
C#にてスケジューラーを作っています.
XAMLでは<ComboBoxItem ~~>と書けば追加されるのはわかりますが,ソースファイルでの追加方法が分かりません.
実現したいのはfor文で回した変数iを追加していくプログラムです.
また数が多くなることも想定してBeginUpdateとEndUpdateを使用してみたいと考えておりましたがその2つのメソッドは使えないのでしょうか?
使用可能でしたらそちらの回答でよろしくお願いします.
該当のソースコード
C#
1 private void addbox_ym(object sender, EventArgs e) 2 { 3 for(int i = 1999; i < 2101; i++) 4 { 5 //selectedYM.Items.Add("test" + i.ToString()); 6 } 7 }
全体のソースコード
XAML
1<Window x:Class="TotalApplication.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:TotalApplication" 7 mc:Ignorable="d" 8 Title="スケジュール表" Height="450" Width="800" MinHeight="225" MinWidth="500"> 9 <Grid> 10 <Grid.RowDefinitions> 11 <RowDefinition Height="24*"/> 12 <RowDefinition Height="395*"/> 13 </Grid.RowDefinitions> 14 <GroupBox x:Name="CalendarGroup1" Header="" Margin="10,16.216,10,10" Grid.Row="1"> 15 <Grid x:Name="CalenderGrid"> 16 <Grid.ColumnDefinitions> 17 <ColumnDefinition Width="1*"/> 18 <ColumnDefinition Width="1*"/> 19 <ColumnDefinition Width="1*"/> 20 <ColumnDefinition Width="1*"/> 21 <ColumnDefinition Width="1*"/> 22 <ColumnDefinition Width="1*"/> 23 <ColumnDefinition Width="1*"/> 24 </Grid.ColumnDefinitions> 25 <Grid.RowDefinitions> 26 <RowDefinition Height="20"/> 27 <RowDefinition Height="15"/> 28 <RowDefinition Height="1*"/> 29 <RowDefinition Height="15"/> 30 <RowDefinition Height="1*"/> 31 <RowDefinition Height="15"/> 32 <RowDefinition Height="1*"/> 33 <RowDefinition Height="15"/> 34 <RowDefinition Height="1*"/> 35 <RowDefinition Height="15"/> 36 <RowDefinition Height="1*"/> 37 <RowDefinition Height="15"/> 38 <RowDefinition Height="1*"/> 39 </Grid.RowDefinitions> 40 <Rectangle Stroke="Black" StrokeThickness="1" Grid.ColumnSpan="7" Grid.RowSpan="13"/> 41 <Rectangle Fill="#ff8000" HorizontalAlignment="Stretch" Grid.Row="0" Grid.Column="0" VerticalAlignment="Stretch" Margin="1 1 0 0" Panel.ZIndex="0"/> 42 <!--5行略--> 43 <Rectangle Fill="#ff8000" HorizontalAlignment="Stretch" Grid.Row="0" Grid.Column="6" VerticalAlignment="Stretch" Margin="1 1 1 0" Panel.ZIndex="0"/> 44 45 <Rectangle Fill="#d3d3d3" HorizontalAlignment="Stretch" Grid.Row="1" Grid.Column="0" VerticalAlignment="Stretch" Margin="1 1 0 0" Panel.ZIndex="0"/> 46 <!--47行略--> 47 <Rectangle Fill="#d3d3d3" HorizontalAlignment="Stretch" Grid.Row="11" Grid.Column="6" VerticalAlignment="Stretch" Margin="1 1 0 0" Panel.ZIndex="0"/> 48 49 <Label Content="日" HorizontalAlignment="Center" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" FontSize="11" Padding="0"/> 50 <!--曜日略--> 51 <Label Content="土" HorizontalAlignment="Center" Grid.Row="0" Grid.Column="6" VerticalAlignment="Center" FontSize="11" Padding="0"/> 52 53 </Grid> 54 </GroupBox> 55 <Label Content="選択した年月: " HorizontalAlignment="Left" Margin="10,15,0,0" VerticalAlignment="Top" Grid.RowSpan="2"/> 56 <Label x:Name="today" Content="今日の日付: " HorizontalAlignment="Left" Margin="250,15,0,0" VerticalAlignment="Top" Grid.RowSpan="2"/> 57 <ComboBox x:Name="selectedYM" HorizontalAlignment="Left" Margin="95,15,0,0" VerticalAlignment="Top" Width="60" Grid.RowSpan="2"> 58 </ComboBox> 59 </Grid> 60</Window> 61
C#
1using System; 2using System.Windows; 3using System.Windows.Controls; 4using System.Windows.Input; 5using System.Windows.Media; 6using System.Windows.Shapes; 7 8namespace TotalApplication 9{ 10 /// <summary> 11 /// MainWindow.xaml の相互作用ロジック 12 /// </summary> 13 public partial class MainWindow : Window 14 { 15 /// <summary> 16 /// 各宣言の説明 17 /// </summary> 18 /// <param name="sRsC">シングルクリック</param> 19 /// <param name="sRdC">ダブルクリック</param> 20 /// <param name="lastClick">最後にクリックした時間</param> 21 /// <param name="clickTimer">クリック判定用時間</param> 22 /// <param name="dC">ダブルクリックが有効な時True</param> 23 private Rectangle sRsC; 24 //private Rectangle sRdC; 25 //private DateTime lastClick; 26 //private TimeSpan clickTimer; 27 //private bool dC; 28 29 /// <summary> 30 /// MainWindow 31 /// </summary> 32 public MainWindow() 33 { 34 InitializeComponent(); 35 36 CalendarGroup1.Header = String.Format("{0:yyyy年MM月}", DateTime.Now); 37 today.Content = String.Format("今日の日付: {0:yyyy年MM月dd日}", DateTime.Now); 38 39 40 //当月の月初を取得 41 var firstDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); 42 43 //曜日の取得 44 int dayofweek = (int)firstDate.DayOfWeek; 45 46 //月末を取得 47 int lastday = firstDate.AddMonths(1).AddDays(-1).Day; 48 49 50 //月初から月末までを走査 51 for (int day = 1; day <= lastday; day++) 52 { 53 //セル位置 54 int index = (day - 1) + dayofweek; 55 //横位置 56 int x = index % 7; 57 //縦位置 58 int y = index / 7; 59 60 //土日の色変更 61 Color color = Colors.Black; 62 if (x == 0) 63 { 64 color = Colors.Red; 65 } 66 else if (x == 6) 67 { 68 color = Colors.Blue; 69 } 70 71 72 //テキストブロックを生成して日付をグリッドに追加 73 var tb_day = new TextBlock() 74 { 75 Text = string.Format("{0}", day), 76 FontSize = 10, 77 Foreground = new SolidColorBrush(color), 78 Padding = new Thickness(5, 0, 0, 0), 79 HorizontalAlignment = HorizontalAlignment.Left, 80 VerticalAlignment = VerticalAlignment.Top 81 }; 82 this.CalenderGrid.Children.Add(tb_day); 83 tb_day.SetValue(Grid.ColumnProperty, x); 84 tb_day.SetValue(Grid.RowProperty, 1 + 2 * y); 85 86 87 //テキストブロックを生成してメモをグリッドに追加(未実装) 88 var tb_memo = new TextBlock() 89 { 90 Text = string.Format("test"), 91 FontSize = 10, 92 Foreground = new SolidColorBrush(color = Colors.Black), 93 Padding = new Thickness(5, 0, 0, 0), 94 HorizontalAlignment = HorizontalAlignment.Left, 95 VerticalAlignment = VerticalAlignment.Top 96 }; 97 this.CalenderGrid.Children.Add(tb_memo); 98 tb_memo.SetValue(Grid.ColumnProperty, x); 99 tb_memo.SetValue(Grid.RowProperty, 2 + 2 * y); 100 101 //四角形を生成してグリッドに追加 102 //セルの枠線などを表示しイベントをハンドリングする用 103 var rect = new Rectangle(); 104 rect.HorizontalAlignment = HorizontalAlignment.Stretch; 105 rect.VerticalAlignment = VerticalAlignment.Stretch; 106 //背景色 107 rect.Fill = Brushes.Transparent; 108 //枠線調整 109 rect.Margin = (x == 6) ? new Thickness(0.0, -1.0, 0.0, 0.0) : new Thickness(0.0, -1.0, 0.0, 0.0); 110 //イベント設定 111 rect.MouseLeftButtonDown += date_mouseleftbuttondown; 112 this.CalenderGrid.Children.Add(rect); 113 rect.SetValue(Grid.ColumnProperty, x); 114 rect.SetValue(Grid.RowProperty, 2 + 2 * y); 115 } 116 } 117 118 /// <summary> 119 /// セル(日)をクリックした際のイベントハンドラ. 120 /// </summary> 121 /// <param name="sender"></param> 122 /// <param name="e"></param> 123 //選択時の枠組み生成 124 void date_mouseleftbuttondown(object sender, MouseButtonEventArgs e) 125 { 126 //既に選択されたセルがある場合は初期化 127 if (sRsC != null) 128 { 129 sRsC.StrokeDashArray = null; 130 sRsC.StrokeThickness = 0; 131 } 132 133 //枠線に点線セット 134 Rectangle rec = sender as Rectangle; 135 rec.Stroke = Brushes.Black; 136 DoubleCollection dbc = new DoubleCollection(); 137 dbc.Add(1); 138 rec.StrokeDashArray = dbc; 139 rec.StrokeThickness = 1; 140 141 142 //選択セルの保持 143 sRsC = rec; 144 145 } 146 147 private void addbox_ym(object sender, EventArgs e) 148 { 149 for(int i = 1999; i < 2101; i++) 150 { 151 //selectedYM.Items.Add("test" + i.ToString()); 152 } 153 } 154 155 } 156} 157
試したこと
この問題を解決するために様々なサイトを見てきましたがたいていの場合,Buttonのクリックイベントに反応するように作られているの多くわかりませんでした.
###今後の予定
・クリックしたときに枠線が日付部分まで囲われないので修正できたら修正したいと思います.
・年月別々のcomboBoxを作り指定された年月のカレンダーを表示させる予定です.
・追加機能としてはダブルクリックした後にメモが書けるようにしたいと考えています.
補足情報(FW/ツールのバージョンなど)
Windows10
Visual Studio 2019 16.2.5
WPFアプリ
.NET Framework 4.7.2
回答2件
あなたの回答
tips
プレビュー