如何为WPF自定义控件构建触发器

时间:2012-01-28 03:24:28

标签: wpf triggers custom-controls

我正在建立一个WPF自定义控件,我正在调用一个ResponseTimer。这基本上由DispatcherTimer和ProgressBar组成。它具有名为TimeElapsed和TimeoutPeriod的属性,它们是TimeSpans。在我的程序的用户界面中,事件会定期发生。用户可以在一段时间内重新加入活动。如果时间间隔到期,程序将自行采取措施。

我想在两个地方使用这个控件。一个将出现在ListBox中,另一个出现在窗口底部。对于ListBox中的cope,当时间段到期时,我想隐藏ProgressBar,而我不想隐藏窗口底部的控件。

为了获得这个功能,我定义了两个名为HideIfExpired和IsExpired的bool DependcyProperties。如果HideIfExpired为true,则如果IsExpired为true,则隐藏ProgressBar。简单。

我想在默认内容模板中为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 个答案:

答案 0 :(得分:1)

<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>