#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. Я добавил снимок этой ошибки. Код работает, но ошибка все еще существует, есть ли способ ее удалить?