У меня был Dictionary.xaml, где я определил путь, указанный здесь, но у меня была ошибка компиляции (см. ошибку ниже).
Поскольку я хочу повторно использовать его в других местах, @Clemens предложил мне поместить его в пользовательский элемент управления WPF, поэтому я сделал это, но у меня по-прежнему возникает ошибка ниже: RoutedEvent Loaded не распознан.
<UserControl x:Class="my.UI.UC.MyUserControl"
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://chemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="200" d:DesignWidth="200">
<Grid>
<Path x:Name="SpinnerPath" Data="M100,10 A90,90 0 0 1 190,100"
Width="24" Height="24"
Stroke="Green" StrokeThickness="20"
StrokeStartLineCap="Round" StrokeEndLineCap="Round"
RenderTransformOrigin="0.5,0.5">
<Path.RenderTransform>
<RotateTransform />
</Path.RenderTransform>
<Path.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard TargetProperty="RenderTransform.Angle">
<DoubleAnimation By="360"
Duration="0:0:1"
RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Path.Triggers>
</Path>
</Grid>
</UserControl>
Компилятор выдает ошибку компиляции:
XDG0012 Элемент "Загружен" не распознан или недоступен
Мне не хватает ссылки на какое-то пространство имен в моем словаре? Если да, то какое пространство имен?
Можете ли вы объяснить, почему вы хотите, чтобы этот путь был ресурсом XAML?
@ Клеменс Я сделаю. Теперь я пытаюсь определить ваш путь в словаре.xaml, а затем привязать его к представлению. Теперь я посмотрю, сработает ли это, и я поставил ваш ответ как принятый в своем другом вопросе.
Это не объяснение. Обычно вы не объявляете элементы пользовательского интерфейса как ресурсы XAML.
@Clemens, потому что в зависимости от обстоятельств я хочу показать путь или нет. Затем программно я собираюсь установить для него значение null или привязать его к статическому ресурсу.
У вас может быть геометрия (данные) в качестве ресурса. Загрузите его как Data="{DynamicResource myArc}"
или около того.
@Clemens Я хотел бы повторно использовать этот путь во всех моих окнах wpf. Это причина.
Поместите его в UserControl.
@Clemens В пользовательском элементе управления WPF? Ммм, это звучит очень хорошо!
@Clemens Я поместил его в пользовательский элемент управления WPF и получаю ту же ошибку. Загруженное событие не распознано.
Понятия не имею, что именно ты сделал. Может быть, задать другой вопрос или отредактировать этот. Однако сначала примите ответы. То, что вы здесь спрашиваете, не имеет ничего общего с вашей предыдущей проблемой.
Вы должны сохранить размер пути, иначе Data и StrokeThickness не поместятся.
Поместите путь в поле просмотра и установите ширину и высоту пользовательского элемента управления.
<UserControl x:Class="my.UI.UC.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="24" Height="24">
<Viewbox>
<Path Data="M100,10 A90,90 0 0 1 190,100"
Width="200" Height="200" Stretch="None"
Stroke="Green" StrokeThickness="20"
StrokeStartLineCap="Round" StrokeEndLineCap="Round"
RenderTransformOrigin="0.5,0.5">
<Path.RenderTransform>
<RotateTransform />
</Path.RenderTransform>
<Path.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard Name="LoadedStoryboard">
<Storyboard TargetProperty="RenderTransform.Angle">
<DoubleAnimation By="360" Duration="0:0:1"
RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Unloaded">
<StopStoryboard BeginStoryboardName="LoadedStoryboard"/>
</EventTrigger>
</Path.Triggers>
</Path>
</Viewbox>
</UserControl>
Итак, как я вижу, RoutedEvent Loaded распознается в окне просмотра. Не могли бы вы объяснить мне, почему? Также высота и ширина пути всегда должны быть такими же, больше или меньше высоты и ширины пользовательского элемента управления?
Событие также распознается любым другим контейнером. Пути просто не было видно.
Это еще один вопрос, но... чтобы остановить потребление ресурсов при выполнении анимации, когда пользовательский элемент управления не виден, есть ли простой способ остановить анимацию, когда она не видна?
Путь должен быть достаточно большим, чтобы показать нерастянутую геометрию. Любое растяжение потеряет центральную точку и, таким образом, исказит вращение.
Когда UserControl не виден, событие Loaded не срабатывает.
Итак, представьте, что я делаю UserControl видимым (который находится внутри другого UserControl), и начинается анимация. Позже, если я сделаю этот UserControl невидимым, я думаю, он автоматически остановит анимацию. Прав ли я тогда?
См. редактирование для Unloaded EventTrigger. Для видимости используйте триггер в стиле пути.
И, возможно, получите книгу WPF, где вы можете прочитать обо всех этих вещах. Я могу порекомендовать WPF Unleashed Адама Натана.
Итак, когда UserControl делается невидимым (после его показа), выполняется триггер Unloaded, поэтому раскадровка останавливается и больше не потребляет ресурсы. Верно? Спасибо за вашу помощь.
Что касается видимости, здесь есть пример, который делает то же самое более или менее: stackoverflow.com/a/17575345/1624552
Теперь, когда вы знаете, что Путь работает, не забудьте принять ответ на свой предыдущий вопрос.