我有一个ToogleButton,其内容我正在以这种方式更改DataTriggers:
<Style x:Key="EstiloToggleButton" TargetType="ToggleButton" BasedOn="{StaticResource {x:Type ToggleButton}}">
<Setter Property="BorderBrush" Value="#FF333333" />
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}" Value="True">
<Setter Property="BorderBrush" Value="#FFFF8000" />
<Setter Property="Content">
<Setter.Value>
<TextBlock Text="p" FontFamily="Wingdings 3" RenderTransformOrigin="0.5,0.5">
<TextBlock.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleY="0.5"/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</TextBlock.RenderTransform>
</TextBlock>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}" Value="False">
<Setter Property="Content">
<Setter.Value>
<TextBlock Text="q" FontFamily="Wingdings 3" RenderTransformOrigin="0.5,0.5">
<TextBlock.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleY="0.5"/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</TextBlock.RenderTransform>
</TextBlock>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
它的外观如下:
以前我已经为每个按钮定义了这个,一切都很好,但是它有很多代码行,所以我决定将它压缩成一个样式,然后将相同的样式应用到我想要的所有ToggleButtons看。
到目前为止一直很好,但现在我遇到了一个问题:只有一个,或者有时两个ToggleButtons同时正常工作,其余的都是空白的:
按钮不知何故互相干扰。这是因为风格吗?
我背后有一些丑陋的代码,因为我需要以特殊的方式在按钮下面显示一个Popup(在XAML中不容易实现)
//Popup FFT
private void visButtonFFT_Checked(object sender, RoutedEventArgs e)
{
popupFFT.IsOpen = true;
}
private void visButtonFFT_Unchecked(object sender, RoutedEventArgs e)
{
popupFFT.IsOpen = false;
}
private void popupFFT_Closed(object sender, EventArgs e)
{
visButtonFFT.IsChecked = false;
}
我为每个ToggleButton都有这个代码(不是很聪明,我知道,但我还在学习)
您是否看到可能导致这种奇怪行为的事情?感谢。
编辑:当我将样式从特定的ToggleButton移动到UserControl的资源时,我唯一改变的是DataTrigger的绑定:它的目标是按钮的实际名称,我不得不改变它到了RelativeSource。答案 0 :(得分:2)
由于Style
是StaticResource
,我相信只会创建Style
内容的一个实例,然后将其传递给任何控件{{{ 1}}被解雇了。
您应该能够使用'x:Shared'属性来创建样式的新实例,而不是跨控件共享相同的实例。
所以,在第一行添加'x:Shared = False':
Setter
应该做的伎俩。
来自MSDN: x:共享属性
设置为false时,修改WPF资源检索行为 对属性资源的请求为每个资源创建一个新实例 请求而不是为所有请求共享相同的实例。
修改:忘记提及,这取决于您居住在<Style x:Key="EstiloToggleButton" TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Type ToggleButton}}" x:Shared ="False" >
<!-- Your code -->
的{{1}}(它应该基于您说出的风格)。