То, как у меня может Быть WPF EventTrigger на триггере Представления, когда базовый Viewmodel диктует его, должно?

Это это лучший способ вычислить размер каталога. Только другой путь все еще использовал бы рекурсию, но был бы немного легче использовать и не так гибок.

float folderSize = 0.0f;
FileInfo[] files = Directory.GetFiles(folder, "*", SearchOption.AllDirectories);
foreach(FileInfo file in files) folderSize += file.Length;
25
задан Dave Clemmer 11 August 2011 в 20:12
поделиться

4 ответа

Обновление: 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:

information

Blend SDK

video on behavioursors

12
ответ дан 28 November 2019 в 21:55
поделиться

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));
    }
}
0
ответ дан 28 November 2019 в 21:55
поделиться

Один из способов, который я нашел для решения этой проблемы, это использование триггера данных на DataTemplate, который содержит вышеупомянутый элемент управления... вероятно, не лучший способ сделать это. Я все еще открыт для лучших идей.

0
ответ дан 28 November 2019 в 21:55
поделиться
[

] Вы также можете поместить булевое свойство 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>  
]
6
ответ дан 28 November 2019 в 21:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: