简体   繁体   English

WPF ToggleButton 不想应用样式

[英]WPF ToggleButton does not want to apply style

My ToggleButton become "green" when "PauseUpdate" is false but otherwise it stay blue (like when the focus is on) althought I put the focus elsewhere.当“PauseUpdate”为假时,我的 ToggleButton 变为“绿色”,否则它保持蓝色(如焦点打开时),尽管我将焦点放在其他地方。 It never becomes red.它永远不会变红。

Also, my text is always "Pause", never "Paused".另外,我的文字总是“暂停”,从不“暂停”。 Why?为什么?

<StackPanel HorizontalAlignment="Right">
                    <ToggleButton HorizontalAlignment="Right" VerticalAlignment="Top" Margin="7" Padding="7" IsChecked="{Binding PauseUpdate}">
                        <TextBox Text="Pause" IsReadOnly="True" Background="Transparent" BorderThickness="0">
                            <TextBox.Style>
                                <Style TargetType="TextBox">
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding PauseUpdate}" Value="true">
                                            <Setter Property="Text" Value="Paused" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBox.Style>

                        </TextBox>

                        <ToggleButton.Background>
                            <SolidColorBrush Color="Green" Opacity=".2"></SolidColorBrush>
                        </ToggleButton.Background>

                        <ToggleButton.Style>
                            <Style TargetType="ToggleButton">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding PauseUpdate}" Value="true">
                                        <Setter Property="Background">
                                            <Setter.Value>
                                                <SolidColorBrush Color="Red" Opacity=".2"></SolidColorBrush>
                                            </Setter.Value>
                                        </Setter>
                                    </DataTrigger>

                                    <DataTrigger Binding="{Binding PauseUpdate}" Value="false">
                                        <Setter Property="Background">
                                            <Setter.Value>
                                                <SolidColorBrush Color="Green" Opacity=".2"></SolidColorBrush>
                                            </Setter.Value>
                                        </Setter>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </ToggleButton.Style>
                    </ToggleButton>
                    
                    <TextBox Width="60"></TextBox>
                </StackPanel>

There are multiple points to be fixed:有多个点需要修复:

  1. TextBox consumes mouse events and thus prevents ToggleButton from responding to them. TextBox使用鼠标事件,从而阻止ToggleButton响应它们。 Moreover, it is just used to show a text.此外,它仅用于显示文本。 So TextBlock is appropriate.所以TextBlock是合适的。

  2. A local value prevails over the value set in Style and thus prevents Style.Triggers from changing actual value.本地值优先于 Style 中设置的值,因此可以防止 Style.Triggers 更改实际值。 So remove the local value and set the value in Style.所以删除本地值并在 Style 中设置值。

  3. The Background when IsChecked is true is given by default ControlTemplate of ToggleButton . IsChecked为 true 时的BackgroundToggleButton的默认 ControlTemplate 给出。 To override it, set a plain ControlTemplate in Template of Style.要覆盖它,请在样式Template中设置一个普通的 ControlTemplate。

Then, the modified ToggleButton would be as follows:然后,修改后的ToggleButton如下:

<ToggleButton HorizontalAlignment="Right" VerticalAlignment="Top" Margin="7" Padding="7"
              IsChecked="{Binding PauseUpdate}">
    <TextBlock>
        <TextBlock.Style>
            <Style TargetType="{x:Type TextBlock}">
                <Setter Property="Text" Value="Pause"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding PauseUpdate}" Value="true">
                        <Setter Property="Text" Value="Paused" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>

    <ToggleButton.Style>
        <Style TargetType="{x:Type ToggleButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ButtonBase}">
                        <Border x:Name="border"
                                Background="{TemplateBinding Background}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                SnapsToDevicePixels="True">
                            <ContentPresenter x:Name="contentPresenter"
                                              Margin="{TemplateBinding Padding}"
                                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                              Focusable="False" RecognizesAccessKey="True"
                                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Background" Value="Transparent"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding PauseUpdate}" Value="true">
                    <Setter Property="Background">
                        <Setter.Value>
                            <SolidColorBrush Color="Red" Opacity=".2"/>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding PauseUpdate}" Value="false">
                    <Setter Property="Background">
                        <Setter.Value>
                            <SolidColorBrush Color="Green" Opacity=".2"/>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ToggleButton.Style>
</ToggleButton>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM