2

我有一个 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 可以同时正常工作,其余的都是空白的:

在此处输入图像描述

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

我背后有一些丑陋的代码,因为我需要以一种特殊的方式在按钮下方显示一个弹出窗口(在 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 的绑定:它以按钮的实际名称为目标,我必须将其更改为相对来源。

4

1 回答 1

2

因为Style是 a StaticResource,所以我相信只会创建一个内容实例,Style然后将其传递给任何一个Setter触发 a 的控件。

您应该能够使用 'x:Shared' 属性来创建样式的新实例,而不是跨控件共享同一个实例。

因此,将 'x:Shared=False' 添加到第一行:

<Style x:Key="EstiloToggleButton" TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Type ToggleButton}}" x:Shared ="False" >
<!-- Your code -->

应该做的伎俩。

来自MSDNx:共享属性

当设置为 false 时,修改 WPF 资源检索行为,以便对属性资源的请求为每个请求创建一个新实例,而不是为所有请求共享同一个实例。

编辑:忘了提,这取决于你Style住在一个ResourceDictionary(它应该基于你说你放置你的风格)。

于 2013-09-08T22:12:37.873 回答