Выпуск MonthPicker размер с MVVM Light toolkit

У меня странная проблема с моим monthpicker.
Он имеет огромную ширину при инициализации.

Я использую MVVM Light Toolkit, и кажется, что это вызывает проблему.

Действительно, со стандартным приложением WPF работает тот же код…

Еще одна подсказка, без всплывающего элемента управления, этот код работает с MVVM Light Toolkit.

Вот мой код:

<Window x_Class="MvvmLight1.MainWindow"
    
    
    SizeToContent="WidthAndHeight"
    Title="MVVM Light Application"
    DataContext="{Binding Main, Source={StaticResource Locator}}">
<Grid>

        <Popup IsOpen="{Binding ElementName=btn, Path=IsChecked}" StaysOpen="False" >

            <Calendar  x_Name="_calendar" 
                       Loaded="_calendar_OnLoaded" 
                       DisplayModeChanged="_calendar_DisplayModeChanged" 
                       DisplayMode="Month"  />
        </Popup>
        <ToggleButton  Height="50" Width="100" Content="Click me" x_Name="btn" ClickMode="Release"/>
</Grid>

И вот код позади:

using System.Windows;
using MvvmLight1.ViewModel;
using System.Windows.Controls;

namespace MvvmLight1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void _calendar_DisplayModeChanged(object sender, CalendarModeChangedEventArgs e)
        {
            _calendar.DisplayMode = CalendarMode.Year;

        }
        private void _calendar_OnLoaded(object sender, RoutedEventArgs e)
        {
            _calendar.DisplayMode = CalendarMode.Year;
        }
    }
}

И вот результат:
Введите описание изображения здесь

Ничего особенного… Я борюсь с этим некоторое время.. Любая помощь будет оценена!

Заранее спасибо!

1 ответ

  1. Итак, я нашел решение своей проблемы.
    Я удалил метод on_loaded и DisplayModeChanged календаря и поместил его содержимое во всплывающее открытое событие.

    Вот полный код для выбора месяца.

    Код xaml (ресурсы для кнопки находятся в метро Mahapps):

        <StackPanel Orientation="Horizontal" Grid.Row="1">
            <Label  Width="100" Height="25" Content="{Binding DateCalendar, Converter={StaticResource MonthConverter} }"/>
            <Popup IsOpen="{Binding ElementName=btn, Path=IsChecked}" StaysOpen="False" Opened="Popup_Opened" PlacementTarget="{Binding ElementName=btn}" Placement="Right" >
                <Calendar  x_Name="_calendar" 
                               DisplayDate="{Binding DateCalendar}"
                               DisplayDateChanged="_calendar_DisplayDateChanged" 
                               DisplayMode="Month"/>
            </Popup>
            <ToggleButton Style="{StaticResource CircleButton}"  x_Name="btn" ClickMode="Release" >
                <Rectangle Width="16" Height="16" Fill="Black">
                    <Rectangle.OpacityMask>
                        <VisualBrush Stretch="Fill"  Visual="{DynamicResource appbar_calendar}" />
                    </Rectangle.OpacityMask>
                </Rectangle>
            </ToggleButton>
        </StackPanel>
    

    Вот код позади:

        private void _calendar_DisplayDateChanged(object sender, CalendarDateChangedEventArgs e)
        {
        //If the user click the button of the calendar to change year, the calendar must remains open
            if (e.RemovedDate.HasValue && e.AddedDate.HasValue)
            {
                if (e.RemovedDate.Value.Year == e.AddedDate.Value.Year)
                {
                    btn.IsChecked = false;
                }
            }
        }
    
        private void Popup_Opened(object sender, EventArgs e)
        {
            _calendar.DisplayMode = CalendarMode.Year;
        }
    

    И конвертер:

    class FullDateToMonthConverter : IValueConverter
    {
    
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return ((DateTime)value).ToString("MMMM yyyy");
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    Я надеюсь, что это будет полезно для кого-то!