###はじめに
いろいろと無駄なソースや美しくないと思いますのでご了承下さい.
そのうえでこのようにすれば「綺麗なソースになるよ!」などのアドバイスも頂けたら嬉しいです.
最終的には総合的なアプリケーションにする予定なのでプラグイン化(できるかは別として)する予定です.
前提・実現したいこと
C#にてスケジューラーを作っています.
XAMLでは<ComboBoxItem ~~>と書けば追加されるのはわかりますが,ソースファイルでの追加方法が分かりません.
実現したいのはfor文で回した変数iを追加していくプログラムです.
また数が多くなることも想定してBeginUpdateとEndUpdateを使用してみたいと考えておりましたがその2つのメソッドは使えないのでしょうか?
使用可能でしたらそちらの回答でよろしくお願いします.
該当のソースコード
C#
private void addbox_ym(object sender, EventArgs e) { for(int i = 1999; i < 2101; i++) { //selectedYM.Items.Add("test" + i.ToString()); } }
全体のソースコード
XAML
<Window x:Class="TotalApplication.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:TotalApplication" mc:Ignorable="d" Title="スケジュール表" Height="450" Width="800" MinHeight="225" MinWidth="500"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="24*"/> <RowDefinition Height="395*"/> </Grid.RowDefinitions> <GroupBox x:Name="CalendarGroup1" Header="" Margin="10,16.216,10,10" Grid.Row="1"> <Grid x:Name="CalenderGrid"> <Grid.ColumnDefinitions> <ColumnDefinition Width="1*"/> <ColumnDefinition Width="1*"/> <ColumnDefinition Width="1*"/> <ColumnDefinition Width="1*"/> <ColumnDefinition Width="1*"/> <ColumnDefinition Width="1*"/> <ColumnDefinition Width="1*"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="20"/> <RowDefinition Height="15"/> <RowDefinition Height="1*"/> <RowDefinition Height="15"/> <RowDefinition Height="1*"/> <RowDefinition Height="15"/> <RowDefinition Height="1*"/> <RowDefinition Height="15"/> <RowDefinition Height="1*"/> <RowDefinition Height="15"/> <RowDefinition Height="1*"/> <RowDefinition Height="15"/> <RowDefinition Height="1*"/> </Grid.RowDefinitions> <Rectangle Stroke="Black" StrokeThickness="1" Grid.ColumnSpan="7" Grid.RowSpan="13"/> <Rectangle Fill="#ff8000" HorizontalAlignment="Stretch" Grid.Row="0" Grid.Column="0" VerticalAlignment="Stretch" Margin="1 1 0 0" Panel.ZIndex="0"/> <!--5行略--> <Rectangle Fill="#ff8000" HorizontalAlignment="Stretch" Grid.Row="0" Grid.Column="6" VerticalAlignment="Stretch" Margin="1 1 1 0" Panel.ZIndex="0"/> <Rectangle Fill="#d3d3d3" HorizontalAlignment="Stretch" Grid.Row="1" Grid.Column="0" VerticalAlignment="Stretch" Margin="1 1 0 0" Panel.ZIndex="0"/> <!--47行略--> <Rectangle Fill="#d3d3d3" HorizontalAlignment="Stretch" Grid.Row="11" Grid.Column="6" VerticalAlignment="Stretch" Margin="1 1 0 0" Panel.ZIndex="0"/> <Label Content="日" HorizontalAlignment="Center" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" FontSize="11" Padding="0"/> <!--曜日略--> <Label Content="土" HorizontalAlignment="Center" Grid.Row="0" Grid.Column="6" VerticalAlignment="Center" FontSize="11" Padding="0"/> </Grid> </GroupBox> <Label Content="選択した年月: " HorizontalAlignment="Left" Margin="10,15,0,0" VerticalAlignment="Top" Grid.RowSpan="2"/> <Label x:Name="today" Content="今日の日付: " HorizontalAlignment="Left" Margin="250,15,0,0" VerticalAlignment="Top" Grid.RowSpan="2"/> <ComboBox x:Name="selectedYM" HorizontalAlignment="Left" Margin="95,15,0,0" VerticalAlignment="Top" Width="60" Grid.RowSpan="2"> </ComboBox> </Grid> </Window>
C#
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Shapes; namespace TotalApplication { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { /// <summary> /// 各宣言の説明 /// </summary> /// <param name="sRsC">シングルクリック</param> /// <param name="sRdC">ダブルクリック</param> /// <param name="lastClick">最後にクリックした時間</param> /// <param name="clickTimer">クリック判定用時間</param> /// <param name="dC">ダブルクリックが有効な時True</param> private Rectangle sRsC; //private Rectangle sRdC; //private DateTime lastClick; //private TimeSpan clickTimer; //private bool dC; /// <summary> /// MainWindow /// </summary> public MainWindow() { InitializeComponent(); CalendarGroup1.Header = String.Format("{0:yyyy年MM月}", DateTime.Now); today.Content = String.Format("今日の日付: {0:yyyy年MM月dd日}", DateTime.Now); //当月の月初を取得 var firstDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); //曜日の取得 int dayofweek = (int)firstDate.DayOfWeek; //月末を取得 int lastday = firstDate.AddMonths(1).AddDays(-1).Day; //月初から月末までを走査 for (int day = 1; day <= lastday; day++) { //セル位置 int index = (day - 1) + dayofweek; //横位置 int x = index % 7; //縦位置 int y = index / 7; //土日の色変更 Color color = Colors.Black; if (x == 0) { color = Colors.Red; } else if (x == 6) { color = Colors.Blue; } //テキストブロックを生成して日付をグリッドに追加 var tb_day = new TextBlock() { Text = string.Format("{0}", day), FontSize = 10, Foreground = new SolidColorBrush(color), Padding = new Thickness(5, 0, 0, 0), HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top }; this.CalenderGrid.Children.Add(tb_day); tb_day.SetValue(Grid.ColumnProperty, x); tb_day.SetValue(Grid.RowProperty, 1 + 2 * y); //テキストブロックを生成してメモをグリッドに追加(未実装) var tb_memo = new TextBlock() { Text = string.Format("test"), FontSize = 10, Foreground = new SolidColorBrush(color = Colors.Black), Padding = new Thickness(5, 0, 0, 0), HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top }; this.CalenderGrid.Children.Add(tb_memo); tb_memo.SetValue(Grid.ColumnProperty, x); tb_memo.SetValue(Grid.RowProperty, 2 + 2 * y); //四角形を生成してグリッドに追加 //セルの枠線などを表示しイベントをハンドリングする用 var rect = new Rectangle(); rect.HorizontalAlignment = HorizontalAlignment.Stretch; rect.VerticalAlignment = VerticalAlignment.Stretch; //背景色 rect.Fill = Brushes.Transparent; //枠線調整 rect.Margin = (x == 6) ? new Thickness(0.0, -1.0, 0.0, 0.0) : new Thickness(0.0, -1.0, 0.0, 0.0); //イベント設定 rect.MouseLeftButtonDown += date_mouseleftbuttondown; this.CalenderGrid.Children.Add(rect); rect.SetValue(Grid.ColumnProperty, x); rect.SetValue(Grid.RowProperty, 2 + 2 * y); } } /// <summary> /// セル(日)をクリックした際のイベントハンドラ. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> //選択時の枠組み生成 void date_mouseleftbuttondown(object sender, MouseButtonEventArgs e) { //既に選択されたセルがある場合は初期化 if (sRsC != null) { sRsC.StrokeDashArray = null; sRsC.StrokeThickness = 0; } //枠線に点線セット Rectangle rec = sender as Rectangle; rec.Stroke = Brushes.Black; DoubleCollection dbc = new DoubleCollection(); dbc.Add(1); rec.StrokeDashArray = dbc; rec.StrokeThickness = 1; //選択セルの保持 sRsC = rec; } private void addbox_ym(object sender, EventArgs e) { for(int i = 1999; i < 2101; i++) { //selectedYM.Items.Add("test" + i.ToString()); } } } }
試したこと
この問題を解決するために様々なサイトを見てきましたがたいていの場合,Buttonのクリックイベントに反応するように作られているの多くわかりませんでした.
###今後の予定
・クリックしたときに枠線が日付部分まで囲われないので修正できたら修正したいと思います.
・年月別々のcomboBoxを作り指定された年月のカレンダーを表示させる予定です.
・追加機能としてはダブルクリックした後にメモが書けるようにしたいと考えています.
補足情報(FW/ツールのバージョンなど)
Windows10
Visual Studio 2019 16.2.5
WPFアプリ
.NET Framework 4.7.2
まだ回答がついていません
会員登録して回答してみよう