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

最佳答案

因为StyleStaticResource,所以我相信将仅创建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中(它应基于您说的放置样式的位置)。

10-08 08:34
查看更多