You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何隐藏Microsoft.UI.Xaml.Controls.CalendarView的前后切换按钮

隐藏UWP CalendarView的前后导航按钮

当CalendarView的最小/最大日期被限制为单个月份时,前后导航箭头会自动禁用,但默认仍会显示。要隐藏这些禁用的箭头,可通过以下两种方法实现:

方法一:自定义控件模板(推荐)

通过修改CalendarView的默认模板,让按钮在禁用时自动隐藏。

  1. 添加布尔值转可见性转换器
    在页面资源中定义转换器,用于根据按钮的启用状态切换可见性:

    public class BooleanToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            bool isEnabled = (bool)value;
            // 反转逻辑:禁用时隐藏
            if (parameter?.ToString() == "Invert")
                isEnabled = !isEnabled;
            return isEnabled ? Visibility.Visible : Visibility.Collapsed;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }
    

    在XAML中引用该转换器:

    <Page.Resources>
        <local:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
    </Page.Resources>
    
  2. 修改CalendarView模板
    提取CalendarView的默认控件模板,找到名为PreviousButton和NextButton的按钮,修改它们的Visibility绑定:

    <Style TargetType="CalendarView">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="CalendarView">
                    <!-- 保留模板其他原有内容 -->
                    <Button x:Name="PreviousButton"
                            Visibility="{Binding IsEnabled, RelativeSource={RelativeSource Self}, 
                                                Converter={StaticResource BooleanToVisibilityConverter}, 
                                                ConverterParameter=Invert}"
                            <!-- 保留按钮其他原有属性 --> />
                    <Button x:Name="NextButton"
                            Visibility="{Binding IsEnabled, RelativeSource={RelativeSource Self}, 
                                                Converter={StaticResource BooleanToVisibilityConverter}, 
                                                ConverterParameter=Invert}"
                            <!-- 保留按钮其他原有属性 --> />
                    <!-- 保留模板其他原有内容 -->
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

方法二:通过代码动态查找并隐藏按钮

如果不想修改模板,可在代码中通过VisualTreeHelper查找按钮并设置可见性:

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    januaryCalendar.MinDate = new DateTime(DateTime.Now.Year, 1, 1);
    januaryCalendar.MaxDate = new DateTime(DateTime.Now.Year, 1, 31);
    
    // 查找并隐藏上一月按钮
    var previousButton = FindVisualChild<Button>(januaryCalendar, "PreviousButton");
    previousButton?.Visibility = Visibility.Collapsed;
    
    // 查找并隐藏下一月按钮
    var nextButton = FindVisualChild<Button>(januaryCalendar, "NextButton");
    nextButton?.Visibility = Visibility.Collapsed;
}

// 递归查找子控件的辅助方法
private T FindVisualChild<T>(DependencyObject parent, string childName) where T : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);
        if (child is T typedChild && ((FrameworkElement)child).Name == childName)
            return typedChild;
        
        var result = FindVisualChild<T>(child, childName);
        if (result != null)
            return result;
    }
    return null;
}

内容的提问来源于stack exchange,提问作者Eugen M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:45:46