DatePicker 的日历占满整个屏幕

Calendar of DatePicker fills whole screen

我的应用程序中有一个 DatePicker,它由 DockPanels 中的 StackPanel 中的 ScrollViewer 中的 UserControl 中的

组成

UserControl 的(简化)xaml 看起来像这样:

<UserControl x:Class="project.UI1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xml:lang="de-DE"
             mc:Ignorable="d" >
    <UserControl.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Width" Value="250"/>
            <Setter Property="TextWrapping" Value="Wrap"/>
            <Setter Property="TextAlignment" Value="Right"/>
            <Setter Property="VerticalAlignment" Value="Center"/>
            <Setter Property="Margin" Value="2"/>
            <Setter Property="Padding" Value="3"/>
        </Style>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="DockPanel.Dock" Value="Top"/>
            <Setter Property="TextWrapping" Value="Wrap"/>
            <Setter Property="MaxWidth" Value="{Binding RelativeSource={RelativeSource AncestorType=Border},Path=ActualWidth}"/>
            <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
        </Style>
        <Style TargetType="{x:Type DatePicker}">
            <Setter Property="Margin" Value="2"/>
            <Setter Property="Width" Value="105"/>
            <Setter Property="MaxWidth" Value="105"/>
            <Setter Property="Height" Value="24"/>
            <Setter Property="VerticalAlignment" Value="Center"/>
            <Setter Property="HorizontalAlignment" Value="Left"/>
        </Style>
        <Style TargetType="{x:Type DockPanel}">
            <Setter Property="DockPanel.Dock" Value="Top"/>
        </Style>
        <Style TargetType="{x:Type Border}">
            <Setter Property="Margin" Value="0"/>
            <Setter Property="Padding" Value="2"/>
        </Style>
        <Style TargetType="{x:Type ScrollViewer}">
            <Setter Property="HorizontalScrollBarVisibility" Value="Disabled"/>
            <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
        </Style>
    </UserControl.Resources>
    <ScrollViewer>
        <StackPanel>
            <DockPanel>
                <TextBlock Text="IK-Nummer des Absenders (z.B. D-Arzt)"/>
                <Border>
                    <TextBox Text="{Binding p_1}"/>
                </Border>
            </DockPanel>
            <DockPanel>
                <TextBlock Text="IK-Nummer der UNI-DAV aus UV-Träger-Verzeichnis"/>
                <Border>
                    <TextBox Text="{Binding p_2}" />
                </Border>
            </DockPanel>
            <DockPanel>
                <TextBlock Text="Datum der Erstellung durch den Leistungserbringer"/>
                <DatePicker SelectedDate="{Binding p_3}"/>
            </DockPanel>
        </StackPanel>
    </ScrollViewer>
</UserControl>

TextBlocks 有一个 250px 的固定宽度,并保存字段的描述,而 TextBoxes 用于用户输入的 TextBoxes 应该随着用户调整 window,以适应 window 宽度的其余部分。
这就是为什么我想出将每个 TextBlock/TextBox-combo 打包在 DockPanel 中的原因,并将它们堆叠在 StackPanel.

但是,当我点击 DatePicker 时,超出的日历横跨整个屏幕:

尽管这看起来很时髦,但我更愿意找回普通的方形日历 "popup"。

不幸的是,我不知道是什么原因导致日历现在变得如此疯狂...

问题出在您的 TextBlock 样式上。它被应用于 DateTimePicker,因为它没有键,因此适用于可视化树下的所有 TextBlock。

你能给样式一个键,并且只将它应用到特定的 TextBlocks 吗?

<Style TargetType="{x:Type TextBlock}" x:Key="TextBlockStyle">
    <Setter Property="Width" Value="250"/>
    <Setter Property="TextWrapping" Value="Wrap"/>
    <Setter Property="TextAlignment" Value="Right"/>
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="Margin" Value="2"/>
    <Setter Property="Padding" Value="3"/>
</Style>

.....

<TextBlock Text="IK-Nummer der UNI-DAV aus UV-Träger-Verzeichnis"
           Style="{StaticResource TextBlockStyle}"/>

更新:

或者,您可以将新的 TextBlock 样式添加到 DatePicker 的资源以覆盖可视化树中更高层的样式:

<DatePicker SelectedDate="{Binding p_3}">
    <DatePicker.Resources>
        <Style TargetType="{x:Type TextBlock}"/>
    </DatePicker.Resources>
</DatePicker>