WPF XAML: Как исправить «Значение не может быть нулевым» с помощью пользовательского RoutedEvent

#wpf #xaml #routed-events

#wpf #xaml #маршрутизируемые события

Вопрос:

Я определил пользовательский RoutedEvent и использую его EventTrigger . Но VS продолжает показывать ошибку.

Определение события:

 public event RoutedEventHandler Lock
{
    add { AddHandler(LockEvent, value); }
    remove { RemoveHandler(LockEvent, value); }
}
public static readonly RoutedEvent LockEvent =
    EventManager.RegisterRoutedEvent("Lock", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyControl));
  

Использование события:

 <UserControl.Triggers>
    <EventTrigger RoutedEvent="{x:Static local:MyControl.LockEvent}">
        <BeginStoryboard/>
    </EventTrigger>
<UserControl.Triggers>
  

Код можно запустить, но под ним всегда есть волнистая строка RoutedEvent="{x:Static local:MyControl.LockEvent}" и выдает ошибку:

 Value cannot be null.
Parameter name: value
  

Как я могу исправить эту ошибку? (или как игнорировать это, не подавляя ошибки конструктора XAML?)


Если я использую RoutedEvent следующим образом: <EventTrigger RoutedEvent="local:MyControl.Lock"> возникает другая ошибка:

 The event 'Lock' is not a RoutedEvent.  
  

И произошел сбой конструкторского представления.
введите описание изображения здесь

Ответ №1:

Вы ссылаетесь на подобное событие, используя xmlnsAlias:ControlType .Событие.

И вы должны добавить событие, скомпилировать, а затем попытаться сослаться на него.

Редактировать: давайте сделаем так, чтобы эта вещь действительно что-то анимировала и завершала ее.

Это работает для меня:

 <UserControl x:Class="WpfApp2.UserControl1"
             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" 
             xmlns:local="clr-namespace:WpfApp2"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Style>
        <Style TargetType="UserControl">
            <Setter Property="Background">
                <Setter.Value>
                    <SolidColorBrush Color="White"/>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Style>
        <UserControl.Triggers>
        <EventTrigger RoutedEvent="local:UserControl1.Lock">
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation
                          To="Green" 
                          Storyboard.TargetProperty="(Control.Background).(SolidColorBrush.Color)"
                          Duration="0:0:0.5"
                          />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        </UserControl.Triggers>
        <Grid>
        <Button Click="Button_Click" Content="Test" VerticalAlignment="Center"/>
    </Grid>
    </UserControl>
  

и

     public partial class UserControl1 : UserControl
    {
        public event RoutedEventHandler Lock
        {
            add { AddHandler(LockEvent, value); }
            remove { RemoveHandler(LockEvent, value); }
        }
        public static readonly RoutedEvent LockEvent =
            EventManager.RegisterRoutedEvent("Lock", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(UserControl1));
        public UserControl1()
        {
            InitializeComponent();
        }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        RoutedEventArgs args = new RoutedEventArgs(UserControl1.LockEvent);
        RaiseEvent(args);
    }
  

Это работает на любой платформе, на которую я нацелен, и анимирует фон usercontrol зеленым.

Комментарии:

1. можете ли вы попробовать свой код на платформе x64? Я скопировал ваш код, все в порядке. но после переключения платформы на x64 произошла ошибка.

2. @lymims Я добавил код для создания события и фактическую анимацию в раскадровку, чтобы доказать, что это работает. Что он и делает, независимо от платформы.

3. Я добавил снимок этой ошибки. Код работает, но ошибка все еще существует, есть ли способ ее удалить?