如何只读取UWP中的CalendarView控件

时间:2017-08-28 06:13:23

标签: xaml calendar uwp uwp-xaml

在我的UWP应用程序中,我添加了一个CalendarView并以编程方式选择了几个日期。现在我想让它只读给最终用户。但是控件不提供这样的功能,并且使得IsEnabled = False不是一个选项。 请让我知道一种使控件只读的方法。 感谢。

注意:键盘出现此问题。当用户点击输入键或空格键时,日历会更改其视图。我想让它变得静止。

4 个答案:

答案 0 :(得分:2)

IsEnabled设置为False是正确的方法。我想你不想使用它的原因是因为这样做会使整个控件变暗。所以真正的问题归结为 - 如何在外观不变的情况下禁用控件?

通常,禁用(即IsEnabled="False")控件的外观在其样式中的Disabled状态中定义。在你的情况下,虽然事情会变得有点复杂,因为你需要更新多个样式,因为CalendarView是一个复杂的控件。

以下是如何做到的。

首先,您需要找到CalendarView控件的default style并将其放入App.xaml。然后,搜索<VisualState x:Name="Disabled">并注释掉此视觉状态中的所有内容。应该有两个,因为第一个用于向上/向下按钮,第二个用于所有星期几 text。

除此之外,您还需要手动更新每个CalendarViewDayItem的颜色,因为用于显示天数TextBlock不会生活在其风格之中。

要在代码中执行此操作,请转到我的回答here并复制Children扩展方法,然后您只需在Loaded事件中运行以下代码即可。请注意,您可能希望延迟一点,以便正确应用Disabled状态。

Loaded += async (s, e) =>
{
    await Task.Delay(100);
    var dayItems = MyCalendarView.Children().OfType<CalendarViewDayItem>();
    foreach (var dayItem in dayItems)
    {
        var textBlock = dayItem.Children().OfType<TextBlock>().Single();
        textBlock.Foreground = new SolidColorBrush(Colors.Black);
    }
};

完成所有这些操作后,您的CalendarView控件现在会在实际禁用时显示正常。

希望这有帮助!

答案 1 :(得分:1)

您也可以尝试

YourCalendarView.IsHitTestVisible = false;

<CalendarView IsHitTestVisible="False" />

答案 2 :(得分:1)

对于那些正在寻找完整代码的人来说。这一切都归功于Justin XL

static int minOne = -1;
    static int plsOne = 1;
    public static async Task ManipCalenderUserInterface(List<CalendarView> calenders, List<List<DateTime>> datesListByMonth)
    {
        try
        {

                CoreDispatcher coreDispatcher = Window.Current.Dispatcher;
                await Task.Run(async () =>
                {
                    await Task.Delay(1000);
                    //coreDispatcher is required since you're not on the main thread and you can't manip UI from worker threads
                    await coreDispatcher.RunAsync(CoreDispatcherPriority.Normal,
                        () =>
                        {
                            int cnt = 0;
                            bool cont = false;
                            bool stop = false;
                            //Highlight color. I get it from my resource file
                            SolidColorBrush colorBrush = (SolidColorBrush)Application.Current.Resources["FgBlue1"];

                            //This code wrote to manipulate multiple calenders
                            foreach (var item in calenders)
                            {
                                var dayItems = item.Children().OfType<CalendarViewDayItem>();
                                var firstDayOfMonth = new DateTime(dayItems.Skip(15).First().Date.Year, dayItems.Skip(15).First().Date.Month, plsOne);
                                var lastDayOfMonth = firstDayOfMonth.AddMonths(plsOne).AddDays(minOne);

                                foreach (var dayItem in dayItems)
                                {
                                    var textBlock = dayItem.Children().OfType<TextBlock>().Single();

                                    int dayNum = System.Convert.ToInt32(textBlock.Text);
                                    if (dayNum == 1 && !stop) cont = true;

                                    if (cont && dayNum >= 1 && dayNum <= lastDayOfMonth.Day)
                                    {
                                        textBlock.Foreground = new SolidColorBrush(Colors.Black);
                                        //Bold the today date on this month's calender
                                        if (dayItem.Date == DateTime.Now.Date)
                                        {
                                            textBlock.FontWeight = FontWeights.Bold;
                                        }

                                        //datesListByMonth: contains all the dates need to be highlighted on th calender
                                        if (datesListByMonth[cnt] != null && datesListByMonth[cnt].Contains(dayItem.Date.Date))
                                            dayItem.Background = colorBrush;
                                    }
                                    if (cont && dayNum == lastDayOfMonth.Day)
                                    {
                                        cont = false;
                                        stop = true;
                                    }
                                }
                                cnt++;
                                cont = false;
                                stop = false;
                            }
                        });
                });

        }
        catch (Exception ex)
        {

        }
    }

答案 3 :(得分:1)

我知道这已经晚了,但假设您希望用户仍然可以选择并滚动浏览月份等,这就是您应该做的所有事情:

<CalendarView SelectionMode="Multiple">
    <CalendarView.Resources>
        <Style TargetType="CalendarViewDayItem">
            <Setter Property="IsHitTestVisible"
                    Value="False" />
            <Setter Property="IsTabStop"
                    Value="False" />
        </Style>
    </CalendarView.Resources>
</CalendarView>

IsHitTestVisible setter将确保无法点击或点按DayViewItem,而IsTabStop setter会阻止键盘对其进行关注。

这使您可以保留完整的CalendarView功能,同时只需禁用用户日期选择。