#c# #silverlight #visualstatemanager #visualstates
#c# #silverlight #visualstatemanager #visualstates
Вопрос:
У меня определено четыре визуальных состояния, каждое из которых влияет на разные дочерние элементы управления в рамках одного элемента управления silver-light. Возможно ли для меня создать другие визуальные состояния, которые вызывают комбинацию этих других?
Итак, если у меня есть Visual_Group_1, Visual_Group_2, Visual_Group_3, Visual_Group_4
- Возможно ли создать, скажем, группу Visual_Comb_1, которая использует состояния в Visual_Group_1 и Visual_Group_3?
- Затем создайте еще одно с именем Visual_Comb_2, которое использует Visual_Group_4 и Visual_Group_3?
Я рад реализовать solution in xaml or codebehind or a combination of both
. Альтернатива, которую я рассматриваю в настоящее время, включает в себя тонны копирования вставки кода, и я не слишком стремлюсь это делать.
Еще немного деталей по запросу:
Это то, что у меня примерно есть прямо сейчас:
<VisualState x:Name="State1">
<ColorAnimation Storyboard.TargetName="Path1"
Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
To="Blue" Duration="0:0:0.5" />
// fade out the rest of the paths...
<ColorAnimation Storyboard.TargetName="Path2"
Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
To="#00000000" Duration="0:0:0.5" />
<ColorAnimation Storyboard.TargetName="Path3"
Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
To="#00000000" Duration="0:0:0.5" />
<ColorAnimation Storyboard.TargetName="Path4"
Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
To="#00000000" Duration="0:0:0.5" />
</VisualState>
<VisualState x:Name="State2">
<ColorAnimation Storyboard.TargetName="Path3"
Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
To="Red" Duration="0:0:0.5" />
// fade out the rest of the paths...
<ColorAnimation Storyboard.TargetName="Path2"
Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
To="#00000000" Duration="0:0:0.5" />
<ColorAnimation Storyboard.TargetName="Path1"
Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
To="#00000000" Duration="0:0:0.5" />
<ColorAnimation Storyboard.TargetName="Path4"
Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
To="#00000000" Duration="0:0:0.5" />
</VisualState>
<VisualState x:Name="State3">
<ColorAnimation Storyboard.TargetName="Path4"
Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
To="Pink" Duration="0:0:0.5" />
// fade out the rest of the paths...
<ColorAnimation Storyboard.TargetName="Path2"
Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
To="#00000000" Duration="0:0:0.5" />
<ColorAnimation Storyboard.TargetName="Path1"
Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
To="#00000000" Duration="0:0:0.5" />
<ColorAnimation Storyboard.TargetName="Path3"
Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
To="#00000000" Duration="0:0:0.5" />
</VisualState>
Моя цель — иметь элемент управления, который при нажатии на циклы перехода из состояния 1 в состояние 3 каждое состояние исчезает по другому пути, одновременно исчезая по другим путям. Моя проблема в том, что в разделе «удалить остальные пути» есть тонна copy paste, поэтому, если бы я хотел добавить Path5, это означало бы добавление его к каждому отдельному визуальному состоянию, которое уже определено, или если бы я хотел изменить цвет fadeoff или анимацию, мне пришлось бы делать это для каждого визуального состояния.
Комментарии:
1. Я надеюсь, что смогу помочь, но с описанием проблемы, которое вы предоставили, довольно сложно выработать конкретное понимание того, что именно вы хотите, чтобы произошло. Возможно ли опубликовать базовую структуру XAML, чтобы мы могли видеть, где в визуальном дереве
VisualStates
реализованы, и предоставьте конкретный пример того, что вы хотите получить. (Например. Я хочу нажать эту кнопку, а затем заставить ‘Control A’ ввести это визуальное состояние, ‘Control B’ ввести это состояние, а все остальные ввести какое-то другое состояние.)2. Я просто добавил немного xaml, чтобы показать, что я сейчас делаю и как я надеюсь улучшить указанный код 🙂
Ответ №1:
Спасибо за предоставление XAML. Вот как я бы решил проблему.
Прежде всего, создайте VisualStates
индивидуально для каждого Path
. (Я бы рекомендовал использовать Style
вместо этого, чтобы избавить вас от перекодирования очень похожих VisualState
элементов в каждый путь, но я недостаточно знаком с ними, чтобы знать, можете ли вы применить разные цвета к каждому.)
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="Path1States">
<VisualState x:Name="Activate">
<Storyboard>
<ColorAnimation Storyboard.TargetName="Path1"
Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
To="Blue"
Duration="0:0:0.5" />
</Storyboard>
</VisualState>
<VisualState x:Name="Deactivate">
<Storyboard>
<ColorAnimation Storyboard.TargetName="Path1"
Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
To="#00000000"
Duration="0:0:0.5" />
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="Path2States">
<!-- ... etc ... -->
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
Теперь создайте List
в коде, который содержит каждый из связанных объектов, а затем настройте свою собственную GoToState
функцию таким образом, чтобы она включала состояние in для одного объекта и вызывала состояние off для остальных.
List<Path> pathList;
public Page() // constructor
{
InitializeComponent();
pathList = new List<Path>();
pathList.Add(Path1);
// and so forth
}
// Call this function when you want to change the state
private void ActivatePath(Path p)
{
foreach (Path listItem in pathList)
{
// If the item from the list is the one you want to activate...
if (listItem == p)
VisualStateManager.GoToState(listItem, "Activate", true);
// otherwise...
else
VisualStateManager.GoToState(listItem, "Deactivate", true);
}
}
Если бы я лучше разбирался в XAML и стилизации, у меня мог бы быть более чистый способ создания визуальных состояний. Однако моя сильная сторона больше связана с логикой и кодированием. При этом, это намного чище, чем записывать одно и то же VisualState
четыре или пять раз ! 🙂
Надеюсь, это поможет!