在我的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”无法识别。
我的想法可以以某种方式实现吗?
感谢您的帮助。
答案 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>