通过样式改变模板中元素的可见性

时间:2018-03-23 09:58:19

标签: wpf xaml

在我的WPF应用程序中,我有一个具有特定样式和模板的自定义控件。此Control需要一个新的Style,它与第一个完全相同,但更改了Template中单个Control的Visibility。我不想复制样式或模板,并且有重复的代码。

我知道元素的名称,我正在尝试通过以下方式实现这一目标:

<Style x:Key="MyStyle2" BasedOn="{StaticResource MyStyle1}"
       TargetType="{x:Type MyControl}">

    <Setter Property="Template" Value="{StaticResource MyControlsTemplate}"/>

    <Style.Triggers>

        <!--This is just for the trigger to be triggred directly -->
        <Trigger Property="Visibility" Value="Visible"> 

            <Setter TargetName="ControlToHideName" Property="Visibility" Value="Collapsed"/>

        </Trigger>

    </Style.Triggers>

</Style>

但它不会编译。它表示名称“ControlToHideName”无法识别。

我的想法可以以某种方式实现吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您无法在样式设定器中使用TargetName。但是你可以做的是将触发器移动到ControlTemplate(你可以使用TargetName的地方)并使用其他一些属性来隐藏那个额外的控制。

示例:

<ControlTemplate x:Key="MyControlsTemplate" TargetType="{x:Type MyControl}">

    <Control Name="controlToHide"/>

    <ToggleButton Name="toggleButton" IsChecked="true"/>

    <ControlTemplate.Triggers>

        <Trigger SourceName="toggleButton" Property="IsChecked" Value="True">

            <Setter TargetName="controlToHide" Property="Visibility" Value="Collapsed" />

        </Trigger>    

    </ControlTemplate.Triggers>

</ControlTemplate>

或者,您可以创建一个新的ControlTemplate并隐藏该额外控件,然后更改样式设置器中的Template

了解您需要此功能的原因可能很有用,我确信我们可以通过其他方式找到解决方案。

修改

另一种解决方案是在自定义控件中创建DependencyProperty,并使用它来设置ControlToHide的可见性。然后,在Style2中,您只需要更改DependencyProperty的值。

MSDN: Implementing Dependency Properties

控制模板示例:

<ControlTemplate x:Key="MyControlsTemplate" TargetType="{x:Type MyControl}">

    <Control Name="controlToHide"/>

    <ControlTemplate.Triggers>

        <DataTrigger Binding="{Binding DependencyPropertyHideControl, RelativeSource={RelativeSource AncestorType={x:Type MyControl}}}" Value="True">

            <Setter TargetName="controlToHide" Property="Visibility" Value="Collapsed" />

        </DataTrigger>    

    </ControlTemplate.Triggers>

</ControlTemplate>

样式示例:

<Style x:Key="MyStyle2" BasedOn="{StaticResource MyStyle1}"
   TargetType="{x:Type MyControl}">

    <Setter Property="DependencyPropertyHideControl" Value="True"/>
    <Setter Property="Template" Value="{StaticResource MyControlsTemplate}"/>

</Style>