NullReferenceException для PART_HeaderButton в календаре WPF - PullRequest
0 голосов
/ 13 июля 2020

У меня есть настраиваемый шаблон элемента управления для моего CalendarItem, и он отлично работает, за исключением того, что при нажатии на месяц (<Button x:Name="PART_HeaderButton">) приложение вылетает с:

System.NullReferenceException: ' Ссылка на объект не установлена ​​для экземпляра объекта. '

Вот большая часть сведений об ошибке.

System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=PresentationFramework
  StackTrace:
   at System.Windows.Controls.Primitives.CalendarItem.<GetCalendarButtons>d__56.MoveNext()
   at System.Windows.Controls.Primitives.CalendarItem.GetCalendarButton(DateTime date, CalendarMode mode)
   at System.Windows.Controls.Primitives.CalendarItem.FocusDate(DateTime date)
   at System.Windows.Controls.Primitives.CalendarItem.HeaderButton_Click(Object sender, RoutedEventArgs e)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.Controls.Primitives.ButtonBase.OnClick()
   at System.Windows.Controls.Button.OnClick()

Я не знаю, что делать с MoveNext или GetCalendarButton или что-нибудь, но дело в том, что мне все равно. Мне не нужно, чтобы название месяца было интерактивным. Если исправление действительно связано с его исправлением, чтобы заставить его работать, это нормально, но меня действительно волнует, чтобы мое приложение не взламывало sh! В любом случае мне не нужен годовой или десятичный режим.

Очевидно, простой ответ - установить кнопку на IsEnabled="False", однако по какой-то причине это не работает! У меня <Button x:Name="PART_HeaderButton" IsEnabled="False"/> и кнопка НЕ ​​отключена. Иногда, если я удаляю IsEnabled, а затем возвращаю его обратно, кнопка становится неактивной, но когда я перехожу к другому виду и обратно или перезапускаю приложение, она возвращается к нормальной кнопке. Установка Command={x:Null} также не останавливает попытку кнопки выполнить (и, следовательно, сбой).

Так как я не понимаю, что, черт возьми, происходит, и не знаю, куда сосредоточьтесь, вот весь мой проклятый календарь:

<Calendar.CalendarItemStyle>
    <Style TargetType="{x:Type CalendarItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type CalendarItem}">
                    <ControlTemplate.Resources>
                        <!--DAY OF WEEK-->
                        <DataTemplate x:Key="{x:Static CalendarItem.DayTitleTemplateResourceKey}">
                            <TextBlock FontSize="12" TextAlignment="Center" Text="{Binding}" VerticalAlignment="Center"/>
                        </DataTemplate>
                    </ControlTemplate.Resources>

                    <!--Entire calendar-->
                    <Border Padding="8 0" Background="{StaticResource BackgroundBlack}" x:Name="itemBorder">
                        <Grid Name="PART_Root">

                            <Grid.RowDefinitions>
                                <!--Month and month nav row-->
                                <RowDefinition Height="{StaticResource monthHeaderHeight}"/>
                                <!--Month view (days grid)-->
                                <RowDefinition/>
                            </Grid.RowDefinitions>

                            <!--TOP ROW (Month)-->
                            <DockPanel Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" LastChildFill="False">
                                <DockPanel.Resources>
                                    <Style TargetType="Button" BasedOn="{StaticResource PlainTextButton}"/>
                                    <Style TargetType="Button" BasedOn="{StaticResource PlainTextButton}" x:Key="arrowStyle">
                                        <Setter Property="Height" Value="14"/>
                                        <Setter Property="Width" Value="36"/>
                                    </Style>
                                </DockPanel.Resources>

                                <!--MONTH NAVIGATION-->
                                <!--Unclear why they have to be in reverse order.-->

                                <Button x:Name="PART_NextButton" DockPanel.Dock="Right" Style="{StaticResource arrowStyle}">
                                    <Image Source="/Resources/Images/Right.png"/>
                                </Button>
                                <Button x:Name="PART_PreviousButton" DockPanel.Dock="Right" Style="{StaticResource arrowStyle}">
                                    <Image Source="/Resources/Images/Left.png"/>
                                </Button>

                                <!--CURRENT MONTH-->
                                <!--TODO: Make sure this is NOT CLICKABLE because clicking crashes (IsEnabled="False" doesn't seem to fix it)-->
                                <Button x:Name="PART_HeaderButton" IsEnabled="False"/>

                            </DockPanel>

                            <Grid Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center">
                                <Grid x:Name="PART_MonthView">
                                    <Grid.RowDefinitions>
                                        <!--Weeks (first row is Days of the Week)-->
                                        <RowDefinition Height="{StaticResource dayOfWeekHeight}"/>
                                        <RowDefinition/>
                                        <RowDefinition/>
                                        <RowDefinition/>
                                        <RowDefinition/>
                                        <RowDefinition/>
                                        <RowDefinition/>
                                    </Grid.RowDefinitions>
                                    <Grid.ColumnDefinitions>
                                        <!--Days-->
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                </Grid>
                            </Grid>
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</Calendar.CalendarItemStyle>

1 Ответ

1 голос
/ 13 июля 2020

Во-первых, я всегда рекомендую смотреть на. NET Reference Source, чтобы понять, что происходит внутри элемента управления.

https://referencesource.microsoft.com/#PresentationFramework / src / Framework / System / Windows / Controls / Primitives / CalendarItem.cs

Причина, по которой IsEnabled не работает, заключается в том, что CalendarItem автоматически устанавливает IsEnabled на кнопку внутри.

Возможно, вы захотите рассмотреть один из следующих вариантов:

  1. Установите IsHitTestVisible="False" на кнопку, чтобы предотвратить ее нажатие
  2. Не включать кнопку вообще и отображать собственную метку месяца с помощью DisplayDate свойство и преобразователь значений для получения названия месяца

Надеюсь, это будет полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...