locked
calender RRS feed

  • שאלה

  • שלום רב!

    לאחר שעות וימים של חיפושים אחר לוח שנה עם ארועים עבור WPF לא מצאתי כלום 

    כן , יש כמה בודדים מאוד מסובכים ואני חדש  אולי יהיה מי שיפתח את עיניי עם לוח שנה שאפשר להכניס בו ארועים עבור WPF # C קל שאפשר לעבוד איתי גם פשוט כמוני  

    איך אפשר להגדיל את הלוח הקיים ?

    נא להבין אותי אני מתוסכל כברסליחה ותודה מראש

    יום שני 13 פברואר 2012 10:37

תשובות

  • התשובה מתייחסת ל - Calendar של מיקרוסופט,

    כמעט לכל חבילת קונטרולים יש קלנדר נפרד, אבל העקרון צריך להיות דומה.

    כמובן שהפתרון משתנה בהתאם לצרכים, אבל הנה הכיוון בגדול:

    1. יצירת Converter שמכיל את כל ה- Event שלך, למשל:

    public class CalendarConverter : IValueConverter
        {
            static Dictionary<DateTime, string> myEvents = new Dictionary<DateTime, string>();
    
            static CalendarConverter()
            {
                myEvents.Add(new DateTime(2012, 2, 17), "My First Event");
                myEvents.Add(new DateTime(2012, 2, 21), "My Second Event");
            }
    
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
    
                string text;
                if (value == null) return null;
                if (!myEvents.TryGetValue((DateTime)value, out text))
                    text = null;
                return text;
            }
    
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return null;
            }
        }

    2. שינוי ה- Style של DayButton

       <Style TargetType="Calendar">
                <Setter Property="CalendarDayButtonStyle">
                    <Setter.Value>
                        <Style TargetType="{x:Type CalendarDayButton}">
                            <Setter Property="MinWidth" Value="30"/>
                            <Setter Property="MinHeight" Value="30"/>
                            <Setter Property="FontSize" Value="10"/>
                            <Setter Property="HorizontalContentAlignment" Value="Center"/>
                            <Setter Property="VerticalContentAlignment" Value="Center"/>
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type CalendarDayButton}">
                                        <Grid>
                                            
                                            <Rectangle x:Name="TodayBackground" Fill="#FFAAAAAA" Opacity="0" RadiusY="1" RadiusX="1"/>
                                            <Rectangle x:Name="SelectedBackground" Fill="#FFBADDE9" Opacity="0" RadiusY="1" RadiusX="1"/>
                                            <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"/>
                                            <Rectangle x:Name="HighlightBackground" Fill="#FFBADDE9" Opacity="0" RadiusY="1" RadiusX="1"/>
                                            
                                            <StackPanel>
                                                <ContentPresenter x:Name="NormalText" TextElement.Foreground="#FF333333" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="5,1,5,1" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                                                <TextBlock Text="{Binding Converter={StaticResource CalendarConverter}}"></TextBlock>
                                            </StackPanel>
                                            
                                            <Path x:Name="Blackout" Data="M8.1772461,11.029181 L10.433105,11.029181 L11.700684,12.801641 L12.973633,11.029181 L15.191895,11.029181 L12.844727,13.999395 L15.21875,17.060919 L12.962891,17.060919 L11.673828,15.256231 L10.352539,17.060919 L8.1396484,17.060919 L10.519043,14.042364 z" Fill="#FF000000" HorizontalAlignment="Stretch" Margin="3" Opacity="0" RenderTransformOrigin="0.5,0.5" Stretch="Fill" VerticalAlignment="Stretch"/>
                                            <Rectangle x:Name="DayButtonFocusVisual" IsHitTestVisible="false" RadiusY="1" RadiusX="1" Stroke="#FF45D6FA" Visibility="Collapsed"/>
                                        </Grid>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </Setter.Value>
                </Setter>
    
            </Style>

    שים לב שיש כמה שינויים מה- Template המקורי, כמו כן הורדתי את כל ה- VSM's לצורך הבהירות.

    עוד אפשר לקרוא כאן, הפתרון שלי מבוסס על זה.


    My Blog: http://benjaminet.wordpress.com

    • סומן כתשובה על-ידי mm-m יום שלישי 14 פברואר 2012 12:26
    יום שני 13 פברואר 2012 11:59
  • כדאי לראות גם את ה- Inner Exception שכנראה נמצא שם,

    אבל אתה בטוח שהגדרת את ה- Converter כמו שצריך?

    לא הבאתי את זה בדוגמא:

    <Window x:Class="WpfCalendar.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfCalendar"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <local:CalendarConverter x:Key="CalendarConverter"></local:CalendarConverter>
            


    My Blog: http://benjaminet.wordpress.com

    • סומן כתשובה על-ידי mm-m יום שלישי 14 פברואר 2012 12:25
    יום שלישי 14 פברואר 2012 11:55

כל התגובות

  • אולי ידוע למישהו על לוח שנה חינם בWPF  שאפשר לשים הערות c#
    • הועבר על-ידי Ido Flatow. _ יום שני 13 פברואר 2012 15:13 הועבר לפורום רלוונטי (מאת:C# and .NET Framework)
    • מוזג על-ידי Elad R Katz יום שלישי 14 פברואר 2012 12:02
    • מוזג על-ידי Elad R Katz יום שלישי 14 פברואר 2012 12:02
    יום שני 13 פברואר 2012 09:54
  • שלום

    ראה מה אתה יכול ללמוד מכאן:

    http://www.codeproject.com/Articles/30329/Creating-an-Outlook-Calendar-using-WPF-Part-1


    בהצלחה, ואם עזרתי, לחץ על 'סמן כתשובה', וסמן את התשובה כמועילה.

    יום שני 13 פברואר 2012 11:51
  • התשובה מתייחסת ל - Calendar של מיקרוסופט,

    כמעט לכל חבילת קונטרולים יש קלנדר נפרד, אבל העקרון צריך להיות דומה.

    כמובן שהפתרון משתנה בהתאם לצרכים, אבל הנה הכיוון בגדול:

    1. יצירת Converter שמכיל את כל ה- Event שלך, למשל:

    public class CalendarConverter : IValueConverter
        {
            static Dictionary<DateTime, string> myEvents = new Dictionary<DateTime, string>();
    
            static CalendarConverter()
            {
                myEvents.Add(new DateTime(2012, 2, 17), "My First Event");
                myEvents.Add(new DateTime(2012, 2, 21), "My Second Event");
            }
    
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
    
                string text;
                if (value == null) return null;
                if (!myEvents.TryGetValue((DateTime)value, out text))
                    text = null;
                return text;
            }
    
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return null;
            }
        }

    2. שינוי ה- Style של DayButton

       <Style TargetType="Calendar">
                <Setter Property="CalendarDayButtonStyle">
                    <Setter.Value>
                        <Style TargetType="{x:Type CalendarDayButton}">
                            <Setter Property="MinWidth" Value="30"/>
                            <Setter Property="MinHeight" Value="30"/>
                            <Setter Property="FontSize" Value="10"/>
                            <Setter Property="HorizontalContentAlignment" Value="Center"/>
                            <Setter Property="VerticalContentAlignment" Value="Center"/>
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type CalendarDayButton}">
                                        <Grid>
                                            
                                            <Rectangle x:Name="TodayBackground" Fill="#FFAAAAAA" Opacity="0" RadiusY="1" RadiusX="1"/>
                                            <Rectangle x:Name="SelectedBackground" Fill="#FFBADDE9" Opacity="0" RadiusY="1" RadiusX="1"/>
                                            <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"/>
                                            <Rectangle x:Name="HighlightBackground" Fill="#FFBADDE9" Opacity="0" RadiusY="1" RadiusX="1"/>
                                            
                                            <StackPanel>
                                                <ContentPresenter x:Name="NormalText" TextElement.Foreground="#FF333333" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="5,1,5,1" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                                                <TextBlock Text="{Binding Converter={StaticResource CalendarConverter}}"></TextBlock>
                                            </StackPanel>
                                            
                                            <Path x:Name="Blackout" Data="M8.1772461,11.029181 L10.433105,11.029181 L11.700684,12.801641 L12.973633,11.029181 L15.191895,11.029181 L12.844727,13.999395 L15.21875,17.060919 L12.962891,17.060919 L11.673828,15.256231 L10.352539,17.060919 L8.1396484,17.060919 L10.519043,14.042364 z" Fill="#FF000000" HorizontalAlignment="Stretch" Margin="3" Opacity="0" RenderTransformOrigin="0.5,0.5" Stretch="Fill" VerticalAlignment="Stretch"/>
                                            <Rectangle x:Name="DayButtonFocusVisual" IsHitTestVisible="false" RadiusY="1" RadiusX="1" Stroke="#FF45D6FA" Visibility="Collapsed"/>
                                        </Grid>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </Setter.Value>
                </Setter>
    
            </Style>

    שים לב שיש כמה שינויים מה- Template המקורי, כמו כן הורדתי את כל ה- VSM's לצורך הבהירות.

    עוד אפשר לקרוא כאן, הפתרון שלי מבוסס על זה.


    My Blog: http://benjaminet.wordpress.com

    • סומן כתשובה על-ידי mm-m יום שלישי 14 פברואר 2012 12:26
    יום שני 13 פברואר 2012 11:59
  • שלום אסף !

    ראשית תודה רבה ראיתי מה שעשית אך לא בדיוק הבנתי איך לבנות את הcalender 

    להערתך מה הצרכים ? ,  לוח פשוט שאפשר לכתוב לתוכו הערות  ותזכורות ראיתי בפוסט שלך שהכנסת outlook לתוך פרויקט הורדתי וזה לא עבד(אולי אין 2010 רק 2007?)

    אך אם יש רעיון כזה בWPF ראיתי שהרבה מנסים לוחות כמו outlook אך אולי כבר יש משהו חצי מובנה  אני מנסה להמשיך להתעמק במה שכתבת למעלה מקווה שבסוף האסימון יפול

    ושוב תודה על השקעתך

    והצלחה רבה

    יום שני 13 פברואר 2012 12:56
  • שים קלנדר בתוך המסך \ UserControl,

    תוסיף את ה- Style המצורף כ- Resource,

    ואת כל האירועים תכניס לתוך ה- Converter.

    אם עדיין לא ברור אשתדל להעלות אח"כ דוגמא מלאה.

    (לא הבנתי את ההערה לגבי ה- Outlook  ובאיזה פוסט מדובר)

    אסף.


    My Blog: http://benjaminet.wordpress.com

    יום שני 13 פברואר 2012 13:19
  • אסף שלום !

    עשיתי כדבריך וקופץ לי שגיאה ללא הסבר שחסר משהו

    שמתי את הstyle בתוך  window.resources  ואח"כ את הקלנדר

    והקוד ומשום מה זה לא זז (תקוע) 

    סליחה על ההפרעה  ותודה על הכל 

    יום שני 13 פברואר 2012 20:01
  • תוכל לפרסם את הקוד \ מה בדיוק אתה מקבל?

    My Blog: http://benjaminet.wordpress.com

    יום שלישי 14 פברואר 2012 08:36
  •   אסף שלום וברכה !

    Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception.

    הוא אינו מוצא את  converter אפילו שהכנסתי אותו במקום

    תודה ושוב תודה על התייחסותך  בסבלנות רבה וסליחה איני מצליח וזה משגע אותי

    יום שלישי 14 פברואר 2012 09:48
  • כדאי לראות גם את ה- Inner Exception שכנראה נמצא שם,

    אבל אתה בטוח שהגדרת את ה- Converter כמו שצריך?

    לא הבאתי את זה בדוגמא:

    <Window x:Class="WpfCalendar.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfCalendar"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <local:CalendarConverter x:Key="CalendarConverter"></local:CalendarConverter>
            


    My Blog: http://benjaminet.wordpress.com

    • סומן כתשובה על-ידי mm-m יום שלישי 14 פברואר 2012 12:25
    יום שלישי 14 פברואר 2012 11:55
  • תודה רבה מאוד זה נקלט לי עכשיו אני מקווה להצליח ליצור לוח שאפשר לכתוב ישיר לתוכו

    ושוב תודה על העזרה והסבלנות

    ובהצלחה  לך אסף

    יום שלישי 14 פברואר 2012 12:28
  • אסף שלום וכל החברים ! (זה שוב אני )

    לגבי הלוח כמו שכתבתי למעלה אני רוצה לוח שאפשר לכתוב הערות כל יום  ולראות אותם

    ומה ששלחת עונה על ההגדרה הבנתי  את המשחק עם הסטייל 

    אך משום מה יחודש קודם או אח"כ זה לא עובד (חוזר להיות קטן)

    ראיתי את הלוח שנה הזה  http://www.eggheadcafe.com/tutorials/xaml/88c6f252-ba7f-4789-97e8-1bd7690ca385/styling-the-wpf-calendar-to-resemble-outlooks-month-view-calendar.aspx

    וזה מצא חן בעיני ומשהו משתבש לי בלהגדיר את הלוח לכל גודל אולי התנסת בזה פעם?

    אני מרגיש חוצפן לבקש עוד תרגיש בנוח לענות לי בחזרה אם עברתי את הגבול

    בתודה על כל מילה

    נ.ב בעצם אתה כתבת על חיבור אאוטלוק לתוכנה אם הבנתי נכון

    יום שלישי 14 פברואר 2012 19:34