我的月度补丁问题很奇怪。 它在初始化时有很大的宽度。
我使用的是MVVM Light Toolkit,似乎导致了这个问题。
实际上,使用标准的WPF应用程序,相同的代码可以正常工作......
另一个提示,没有弹出控件,此代码适用于MVVM Light Toolkit。
这是我的代码:
<Window x:Class="MvvmLight1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
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>
以下是代码Behind:
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;
}
}
}
没什么好看的......我现在已经挣扎了一段时间..任何帮助都会受到赞赏!
提前致谢!
答案 0 :(得分:0)
好的,我找到了解决问题的方法。 我删除了日历的on_Loaded和DisplayModeChanged方法,并将其内容放入弹出打开的事件中。
以下是月份选择器的完整代码。
xaml代码(按钮的资源来自Mahapps Metro):
<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();
}
}
我希望它对某人有用!