在我的UWP应用程序中,我添加了一个CalendarView并以编程方式选择了几个日期。现在我想让它只读给最终用户。但是控件不提供这样的功能,并且使得IsEnabled = False不是一个选项。 请让我知道一种使控件只读的方法。 感谢。
注意:键盘出现此问题。当用户点击输入键或空格键时,日历会更改其视图。我想让它变得静止。
答案 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
功能,同时只需禁用用户日期选择。