【问题标题】:Creating events/appointments for custom calender WPF为自定义日历 WPF 创建事件/约会
【发布时间】:2011-12-22 19:15:46
【问题描述】:

我制定了一个如下所示的自定义时间表,它可以正常工作,但现在我正在尝试添加活动/约会,但我终生无法弄清楚如何做到这一点。我希望能够单击日历上的一个按钮(日期),创建约会/事件,然后将事件的标题添加到在正确的网格单元(日期)上为其创建的 txtblock(网格单元)在日历上。我不知道如何通过单击指定的按钮来访问某个网格单元。我不会为这段代码的编写方式感到自豪。我最初想要一个 MVVM,但现在这个工作。我必须解决的问题是每次我单击 按钮更改月份时,都会生成一个新月份并删除旧月份。所以一次只制作一个月。请提供任何帮助。

wpf 的一部分:使用 ItemsControl

  <ItemsControl.ItemTemplate>

            <DataTemplate>

                    <StackPanel>


                        <Button Content="{Binding day}" Width="175" HorizontalAlignment="Stretch" VerticalAlignment="Top" VerticalContentAlignment="Top" HorizontalContentAlignment="Left" Name="btnCalenderDate" Click="btnCalenderDate_Click" Loaded="btnCalenderDate_Loaded" Height="18" FontSize="10" FontWeight="Bold">

                        </Button>
                        <TextBlock OpacityMask="Black"  Name="txtBlockdays" VerticalAlignment="Top" TextWrapping="Wrap">
                        
                        </TextBlock>
                        
                    </StackPanel>
                </DataTemplate>
                
            </ItemsControl.ItemTemplate>


        <!-- ItemContainerStyle -->
        <ItemsControl.ItemContainerStyle>
            
            
            <Style >
                    
                    <Setter Property="Grid.Column" Value="{Binding WeekDay}"  />
                <Setter Property="Grid.Row" Value="{Binding WeekNo}" />
                
            </Style>

            </ItemsControl.ItemContainerStyle>

制作日历的类。

    public partial class SchedulePage : Page, INotifyPropertyChanged 
{
    
     public event PropertyChangedEventHandler PropertyChanged;
    MainWindow _parentForm;
    
    Schedule sched = new Schedule();
    DateTime date = DateTime.Now;
   
    
    Event newevent;

   
   


   public SchedulePage(MainWindow parentForm)
    {
        InitializeComponent();
       
        _parentForm = parentForm;

        DateTime date = DateTime.Now; //These couple of lines determine the current month to show on startup.
        _numValue = date.Month;
        _numYear = date.Year;
        //int year = date.Year;
        _nameofmonth = NumValue;
        _nameofyear = NumYear;
        lblcurrentdate.Content = date.Month + "/ " + date.Day + "/ " + date.Year;
        makeCalender();
    }
   
//The region below are properties that are passed in to makeCalender() when the DateRight and DateLeft buttons 
    // get clicked theses values change. The properties hold the month and the year. Everytime a user
    // clicks forward or backward to the next month, these values equal to the selected current month & year.
    
    // However, Everytime these values change a new calender is made and the old one is cleared(deleted).
    #region 
    // properties 
   public void NotifyPropertyChanged(String info)
    {
       // if (PropertyChanged != null)
       // {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        //}
    }

    private int _numValue;
    public int NumValue
    {
        get { return _numValue; }
        set
        {
            _numValue = value;
            
        }
    }

    private int _numYear;
    public int NumYear
    {
        get { return _numYear; }
        set
        {
            _numYear = value;
            
        }
    }

    
   private int _nameofmonth ;
    
    public int NameofMonth
    {
        get
        {
            return this._nameofmonth;
        }

        set
        {
            if (value != this._nameofmonth)
            {
                this._nameofmonth = value;
                NotifyPropertyChanged("NameofMonth");
            } return; 
        }
    }

    private int _nameofyear;
    public int NameofYear
    {
        get
        {
            return this._nameofyear;
        }

        set
        {
            if (value != this._nameofyear)
            {
                this._nameofyear = value;
                NotifyPropertyChanged("NameofYear");
            } return;
        }
    }
   #endregion //end of properties

    //void TheViewModel_PropertyChanged(object src, PropertyChangedEventArgs e)
 /*    
    {
        _parentForm.bindings.schedule.Clear();
        _nameofmonth = NumValue;//comboMonth.SelectedIndex + 1;

        _nameofyear = comboYear.SelectedIndex + 2011;

        makeCalender();
      
    } */

    
    // makeCalender() is how the calender is created and how it determines the gridcell layout of each month.
    public void makeCalender() {
       
        var t = new List<Schedule>();
        DateTime curr = DateTime.Now;
        int[] m = new int[7];
       DateTime newcurr = new DateTime(NameofYear, NameofMonth, 1);
       
        var cal = System.Globalization.DateTimeFormatInfo.CurrentInfo.Calendar;
        var ms = cal.GetWeekOfYear(new DateTime(newcurr.Year, newcurr.Month, 1), System.Globalization.CalendarWeekRule.FirstDay, System.DayOfWeek.Sunday);
        for (int k = 0; k < 7; k++)
        {
            for (var i = 1; newcurr.Month == NameofMonth; newcurr = newcurr.AddDays(1))
            {
                
                var month_week = (newcurr.Day / 7);
                sched.MonthWeek = newcurr.GetWeekOfMonth().ToString();
                sched.Month = newcurr.Month.ToString();
                sched.Year = newcurr.Year.ToString();
                sched.day = newcurr.Day.ToString();
                sched.WeekOfYear = cal.GetWeekOfYear(newcurr, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString();
                sched.dayofweek = newcurr.DayOfWeek.ToString();
                t.Add(sched);
                
          //Here is where the calender is created. By looping through all the days in the selected month it will find the weeknumber and day of the week -->
          // that that particular date belongs to and place in the correct gridcell.
          _parentForm.bindings.schedule.Add(new Schedule { WeekNo = newcurr.GetWeekOfMonth() - 1, WeekDay = (int)newcurr.DayOfWeek, day = newcurr.Day.ToString() });
               
                lblDate.Content = getMonth(newcurr.Month) + " " + newcurr.Year; //getMonth() determines string format of current month displayed.
                
            }
        }
       
        
        DataContext = _parentForm.bindings;

        

    }

   // btnDateRight_Click allows us to navigate forward to the next month, if current month is -->
    //      december then the current year is incremented and the month starts on january (NumValue = 01)
     private void btnDateRight_Click(object sender, RoutedEventArgs e)
     {
         _parentForm.bindings.schedule.Clear();
         if (NumValue >= 1 && NumValue < 12)
         {
             NumValue += 1;
            
             _nameofmonth = NumValue;

         } else 
         {
            
             NumYear += 1;
             _nameofyear = NumYear;
             NumValue = 01;
             _nameofmonth = NumValue;
         }
         makeCalender();
     }

     // btnDateLeft_Click allows us navigate backwards to a previous month
     //  if navigating back and the current month is january, then the year is deincremented the current month is -->
     // set to December (NumValue = 12)
     private void btnDateLeft_Click(object sender, RoutedEventArgs e)
     {
         _parentForm.bindings.schedule.Clear();
         if (NumValue > 1 && NumValue <= 12)
         {
             NumValue -= 1;
             
             _nameofmonth = NumValue;

             
         }
         else 
         {
             NumYear -= 1;
             _nameofyear = NumYear;
             NumValue = 12;
             _nameofmonth = NumValue;
             
         }
         makeCalender(); 
     }

    // btnCalenderDate_Click (as of 11/5/2011) will only return the current month, day, year in messagebox 
    // --> Problem is displaying an event on the textblock(gridcell) of the selected button(date). -->
    // Example: If I click on the button 5 of november 2011(11/5/2011) I should be able to make an event
    // and display the title of the event on that pictular gridcell of 11/5/2011. 
     private void btnCalenderDate_Click(object sender, RoutedEventArgs e) 
     {
         Button b = e.Source as Button;
          
         int day = Convert.ToInt32(b.Content);
         MessageBox.Show(NumValue + "/" + b.Content + "/" + NumYear);
         //b.Content = "123";
     
         newevent = new Event(NumValue, day, NumYear); 
         newevent.Show();
         
         
         
     }

    //btnCalenderDate_Loaded will determine todays date and highlight the button. 
     private void btnCalenderDate_Loaded(object sender, RoutedEventArgs e) //Sets the current day on the calender
     {
         DateTime date = DateTime.Now;
         Button today = e.Source as Button;
         
         if (NumValue == date.Month && (String)today.Content == date.Day.ToString() && NumYear == date.Year)
         {
             today.Background = Brushes.Aqua;
         } 
     }

【问题讨论】:

    标签: c# wpf visual-studio


    【解决方案1】:

    我不太确定您要做什么,但是您是否考虑过使用 DataGrid.HitTest Method 这可能是更好的方法。您可以使用鼠标点作为点击测试参数,它会为您提供行和列。

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多