如何将日期选择器的日历可见性设置为隐藏的wpf

How to set the visibility of calendar of datepicker to hidden wpf

我处于这样一种情况,我需要开发 DatePicker,其中日历必须在鼠标离开事件时消失,只有带有来自日历的 selected 日期的文本框必须可见并且日历部分必须消失,并且日历部分必须仅出现在 DatePicker 的鼠标输入上,以便用户能够 select 日期并在他 select 编辑并失去焦点时立即消失。

我不知道 DatePicker 的哪个控件的可见性必须设置为可见或隐藏。 我尝试了 DatePicker 模板中的一些东西,我在 xaml 的资源部分给出的 link 上找到了它,方法是将可见性设置为隐藏或可见,但没有任何效果。例如下面的 CalendarStyle

 <DatePicker x:Name="MyDatePicker" Margin="0,0,305,28" 
  CalendarStyle="{StaticResource CalendarName}">
 </DatePicker> 

我的 xaml 代码的完整控件样式在这里 :

<Window x:Class="calendarHideTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <!--Here i kept the style of DatePicker written at link https://docs.microsoft.com/en-us/dotnet/framework/wpf/controls/calendar-styles-and-templates-->                
    </Window.Resources>
    <StackPanel>
        <DatePicker x:Name="MyDatePicker" 
                    Margin="0,0,305,28" 
                    CalendarStyle="{StaticResource CalendarName}">
        </DatePicker>
    </StackPanel>
</Window>

我想知道,我必须将日期选择器的哪个子控件设置为可见性 "Hidden" 才能使日历部分 消失

如果我理解正确,你可以使用这种方法。

<DatePicker x:Name="datePicker" Width="100" Height="50" MouseEnter="DatePicker_OnMouseEnter" MouseLeave="DatePicker_OnMouseLeave" Loaded="DatePicker_OnLoaded"/>

在后面的代码中。

...
    private void DatePicker_OnMouseEnter(object sender, MouseEventArgs e)
    {
        ChangeCalendarButtonVisibility(Visibility.Visible);
    }

    private void DatePicker_OnMouseLeave(object sender, MouseEventArgs e)
    {
        ChangeCalendarButtonVisibility(Visibility.Collapsed);
    }

    private void DatePicker_OnLoaded(object sender, RoutedEventArgs e)
    {
        //We use loaded event to hide button in initial state
        ChangeCalendarButtonVisibility(Visibility.Collapsed);
    }

    private Button GetCalendarButton()
    {
        var template = datePicker.Template;
        var button = (Button)template.FindName("PART_Button", datePicker);
        return button;
    }

    private void ChangeCalendarButtonVisibility(Visibility visibility)
    {
        var button = GetCalendarButton();
        if (button != null)
        {
            button.Visibility = visibility;
        }
    }
...

您甚至不需要在控件资源中存储 DatePicker 样式。