风格仅适用于两个元素

时间:2013-09-08 21:38:10

标签: c# wpf styles

我有一个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>

它的外观如下:

enter image description here

enter image description here

以前我已经为每个按钮定义了这个,一切都很好,但是它有很多代码行,所以我决定将它压缩成一个样式,然后将相同的样式应用到我想要的所有ToggleButtons看。

到目前为止一直很好,但现在我遇到了一个问题:只有一个,或者有时两个ToggleButtons同时正常工作,其余的都是空白的:

enter image description here

按钮不知何故互相干扰。这是因为风格吗?

我背后有一些丑陋的代码,因为我需要以特殊的方式在按钮下面显示一个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。

1 个答案:

答案 0 :(得分:2)

由于StyleStaticResource,我相信只会创建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}}(它应该基于您说出的风格)。