Как создать триггеры для пользовательского элемента управления WPF - PullRequest
0 голосов
/ 28 января 2012

Я создаю пользовательский элемент управления WPF, который я вызываю ResponseTimer. Это в основном состоит из DispatcherTimer и ProgressBar. У этого есть свойства, названные TimeElapsed и TimeoutPeriod, которые являются TimeSpans. В пользовательском интерфейсе моей программы события происходят периодически. Существует период времени, в течение которого пользователь может повторно открыть событие. Если интервал истекает, программа выполняет действие самостоятельно.

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

Чтобы получить эту функциональность, я определил два bool DependcyProperties с именами HideIfExpired и IsExpired. Если HideIfExpired имеет значение true, то ProgressBar будет скрыт, если IsExpired имеет значение true. Простой.

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

Вот XAML для элемента управления:

<Style  TargetType="{x:Type local:ResponseTimer}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:ResponseTimer}">
                <StackPanel Visibility="{TemplateBinding Visibility}">
                    <ProgressBar Background="{TemplateBinding Background}"
                                 BorderBrush="{TemplateBinding BorderBrush}"
                                 BorderThickness="{TemplateBinding BorderThickness}"
                                 FlowDirection="{TemplateBinding FlowDirection}"
                                 Foreground="{TemplateBinding Foreground}"
                                 Height="{TemplateBinding Height}"
                                 HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
                                 IsEnabled="{TemplateBinding IsEnabled}"
                                 IsTabStop="False"
                                 Margin="{TemplateBinding Margin}"
                                 MaxHeight="{TemplateBinding MaxHeight}"
                                 MaxWidth="{TemplateBinding MaxWidth}"
                                 MinHeight="{TemplateBinding MinHeight}"
                                 Minimum="0"
                                 MinWidth="{TemplateBinding MinWidth}"
                                 Name="PART_ProgressBar"
                                 Opacity="{TemplateBinding Opacity}"
                                 OpacityMask="{TemplateBinding OpacityMask}"
                                 Orientation="{TemplateBinding Orientation}"
                                 Padding="{TemplateBinding Padding}"
                                 Panel.ZIndex="{TemplateBinding Panel.ZIndex}"
                                 RenderSize="{TemplateBinding RenderSize}"
                                 RenderTransform="{TemplateBinding RenderTransform}"
                                 RenderTransformOrigin="{TemplateBinding RenderTransformOrigin}"
                                 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                 Style="{TemplateBinding Style}"
                                 Tag="{TemplateBinding Tag}"
                                 ToolTip="{TemplateBinding ToolTip}"
                                 UseLayoutRounding="{TemplateBinding UseLayoutRounding}"
                                 VerticalAlignment="{TemplateBinding VerticalAlignment}"
                                 Visibility="{Binding Path=IsExpired, Converter={StaticResource InvertedBoolToVisibility}, RelativeSource={RelativeSource TemplatedParent}}"
                                 Width="{TemplateBinding Width}" />
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

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

В любом случае, как мне написать мои триггеры?

1 Ответ

1 голос
/ 28 января 2012
<ControlTemplate.Triggers>
    <MultiTrigger>
        <MultiTrigger.Conditions>
            <Condition Property="IsExpired" Value="True" />
            <Condition Property="HideIfExpired" Value="True" />
        </MultiTrigger.Conditions>
        <MultiTrigger.Setters>
            <Setter Property="Visibility" Value="Collapsed" />
        </MultiTrigger.Setters>
    </MultiTrigger>
 </ControlTemplate.Triggers>
...