0

月ピッカーに奇妙な問題があります。初期化時の幅が非常に広いです。

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>

コードビハインドは次のとおりです。

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;
        }
    }
}

そしてここに結果があります: ここに画像の説明を入力

空想は何もありません...私はしばらくの間それに苦労しています..どんな助けもいただければ幸いです!

前もって感謝します!

4

1 に答える 1

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();
    }
}

誰かの役に立てば幸いです!

于 2016-11-09T09:02:15.907 に答える