Это это лучший способ вычислить размер каталога. Только другой путь все еще использовал бы рекурсию, но был бы немного легче использовать и не так гибок.
float folderSize = 0.0f;
FileInfo[] files = Directory.GetFiles(folder, "*", SearchOption.AllDirectories);
foreach(FileInfo file in files) folderSize += file.Length;
Обновление: Firoso, как упоминалось в комментариях, вы должны быть в состоянии (я думаю - т.е. непроверенные) использовать компоненты поведения бленда, чтобы удовлетворить вашим требованиям.
В дополнение к загрузке и установке SDK. Получите копию библиотеки примеров выражений blend (вам нужно будет нажать на кнопку Downloads по следующей ссылке): Библиотека примеров сочетания выражений
Эта библиотека содержит встроенный триггер под названием 'DataEventTrigger', который можно использовать для запуска действий в ответ на событие, объявленное на вашей вид-модели.
В SDK сочетания уже есть (из того, что я могу сказать) другой кусочек головоломки - он уже включает в себя действие, которое позволяет вам управлять раскадровками. Название этого действия 'ControlStoryboardAction'.
В итоге вы должны получить какой-нибудь xaml, который выглядит следующим образом:
<i:Interaction.Triggers>
<samples:DataEventTrigger EventName="YourEvent">
<im:ControlStoryboardAction Storyboard="{StaticResource Storyboard1}"
ControlStoryboardOption="Play"/>
</samples:DataEventTrigger>
</i:Interaction.Triggers>
Замените 'YourEvent' на название события, которое вы определили на вашей вьюмодели, и замените 'Storyboard1' на название вашей раскадровки. Конечно же, имена должны точно совпадать.
Вот использованные xaml определения пространства имён:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:im="clr-namespace:Microsoft.Expression.Interactivity.Media;assembly=Microsoft.Expression.Interactions"
xmlns:samples="clr-namespace:Expression.Samples.Interactivity;assembly=Expression.Samples.Interactivity"
Original post, before edit:
Suggest you look into Expression Blend Behaviors:
I believe you would have to bind to a RoutedEvent
instance, not a CLR event.
I haven't tried it, but something like this should work:
public class UnitView
{
public static readonly RoutedEvent ActivateGlowEvent
= EventManager.RegisterRoutedEvent(
"ActivateGlow", RoutingStrategy.Bubble,
typeof(RoutedEventHandler), typeof(UnitView)
);
public void RaiseActivateGlowEvent()
{
RaiseEvent(new RoutedEventArgs(ActivateGlowEvent));
}
}
Один из способов, который я нашел для решения этой проблемы, это использование триггера данных на DataTemplate, который содержит вышеупомянутый элемент управления... вероятно, не лучший способ сделать это. Я все еще открыт для лучших идей.
] Вы также можете поместить булевое свойство IsGlowing в свою viewmodel и использовать дататриггеры в своем стиле [
] [<Rectangle.Style>
<Style TargetType="{x:Type Rectangle}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsGlowing}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
...
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
]