我有一个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>
它是这样的:
以前,我已经为每个按钮定义了此按钮,并且一切正常,但是代码行很多,因此我决定将其压缩为一种样式,然后将相同的样式应用于所需的外观的所有ToggleButton。
到目前为止还算不错,但是现在我有一个问题:只有一个,有时两个ToggleButtons可以同时正常工作,其余的则为空白:
按钮以某种方式相互干扰。是否可能因为风格?
我后面有一些丑陋的代码,因为我需要以特殊方式在按钮下方显示弹出窗口(在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的Binding:它的目标是按钮的实际名称,我必须将其更改为RelativeSource。
最佳答案
因为Style
是StaticResource
,所以我相信将仅创建Style
内容的一个实例,然后将其传递给呈现给Setter
的任何控件。
您应该能够使用'x:Shared'属性创建样式的新实例,而不是在控件之间共享同一实例。
因此,在第一行中添加“ x:Shared = False”:
<Style x:Key="EstiloToggleButton" TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Type ToggleButton}}" x:Shared ="False" >
<!-- Your code -->
应该做到的。
从MSDN:x:共享属性
设置为false时,修改WPF资源检索行为,以便
对属性资源的请求将为每个请求创建一个新实例
请求,而不是为所有请求共享相同的实例。
编辑:忘记提及了,这取决于您的
Style
驻留在ResourceDictionary
中(它应基于您说的放置样式的位置)。