为了账号安全,请及时绑定邮箱和手机立即绑定

IntegerUpDown 控件在 Textbox IsFocused 时更改背景

IntegerUpDown 控件在 Textbox IsFocused 时更改背景

C#
慕桂英3389331 2022-07-23 17:08:51
我正在创建一个 WPF 应用程序并使用 WPF 扩展工具包库。我已将 IntegerUpDown 控件添加到我的 UserControl 中,当用户在文本框内按下时,我希望背景颜色从深灰色变为浅灰色。我尝试在 xaml 中添加一个样式触发器,该触发器在 IntegerUpDown 控件 IsFocused 用于背景更改时触发。但是,这似乎不起作用。<xctk:IntegerUpDown x:Name="Day" Value="{Binding DayText, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" Style="{StaticResource IntegerUpDownStyle}" Minimum="{Binding MinimumDateSelection}" Maximum="{Binding MaximumDateSelection}">                            <xctk:IntegerUpDown.Watermark>                                <TextBlock Text="Day" Foreground="{StaticResource OffsetWhiteBrush}" Margin="0,0,60,0"/>                            </xctk:IntegerUpDown.Watermark>                        </xctk:IntegerUpDown><!-- Textbox and PasswordBox base styling for login boxes -->    <Style x:Key="IntegerUpDownStyle" TargetType="{x:Type Control}" BasedOn="{StaticResource BaseTextStyle}">        <Setter Property="MaxWidth" Value="400" />        <Setter Property="BorderThickness" Value="0" />        <Setter Property="FontSize" Value="{StaticResource FontSize20}" />        <Setter Property="FontFamily" Value="{StaticResource LatoRegular}" />        <Setter Property="Background" Value="{StaticResource DarkGreyBrush}" />        <Setter Property="Margin" Value="0,20,0,0" />        <Style.Triggers>            <Trigger Property="IsFocused" Value="True">                <Setter Property="Background" Value="{StaticResource LightGreyBrush}" />            </Trigger>            <Trigger Property="Validation.HasError" Value="True">                <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" />            </Trigger>        </Style.Triggers>    </Style>通过我添加的样式,我希望控件的背景从深灰色变为浅灰色,但没有发生任何事情。我怎样才能做到这一点?
查看完整描述

3 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

我在自己的应用程序中尝试了这个问题,它已经完成了。这是代码:


<Window

x:Class="WpfApp16.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:local="clr-namespace:WpfApp16"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"

Title="MainWindow"

Width="800"

Height="450"

mc:Ignorable="d">

<Window.Resources>

    <Style x:Key="IntegerUpDownStyle" TargetType="xctk:IntegerUpDown">

        <Style.Triggers>

            <EventTrigger RoutedEvent="ValueChanged">

                <EventTrigger.Actions>

                    <BeginStoryboard>

                        <Storyboard>

                            <ColorAnimation

                                Storyboard.TargetProperty="Background.Color"

                                From="DarkGray"

                                To="Transparent"

                                Duration="0:0:1" />

                        </Storyboard>

                    </BeginStoryboard>

                </EventTrigger.Actions>


            </EventTrigger>

        </Style.Triggers>

    </Style>

</Window.Resources>

<StackPanel>


    <xctk:IntegerUpDown Width="200" Style="{StaticResource IntegerUpDownStyle}">

        <xctk:IntegerUpDown.Background>

            <SolidColorBrush Color="Transparent" />

        </xctk:IntegerUpDown.Background>

    </xctk:IntegerUpDown>

</StackPanel>


查看完整回答
反对 回复 2022-07-23
?
万千封印

TA贡献1891条经验 获得超3个赞

IntegerUpDown 源代码中的相同触发器,因此外部触发器不再有效。


IntegerUpDown 源代码:


<Trigger Property="IsFocused" Value="True">

    <Setter TargetName="PART_TextBox"

          Property="FocusManager.FocusedElement"

          Value="{Binding ElementName=PART_TextBox}" />

</Trigger>

我尝试使用 GotFocus 和 LostFocus 事件。


xml:


<xctk:IntegerUpDown x:Name="Day" 

     LostFocus="IntegerUpDown_LostFocus" 

     GotFocus="IntegerUpDown_GotFocus"  

     Focusable="True"  

     Value="{Binding DayText, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" Style="{StaticResource IntegerUpDownStyle}" Minimum="{Binding MinimumDateSelection}" Maximum="{Binding MaximumDateSelection}">

   <xctk:IntegerUpDown.Watermark>

        <TextBlock Text="Day" Foreground="{StaticResource OffsetWhiteBrush}" Margin="0,0,60,0"/>

    </xctk:IntegerUpDown.Watermark>

</xctk:IntegerUpDown>

cs代码:


private void IntegerUpDown_GotFocus(object sender, RoutedEventArgs e)

{

    Day.Background = new SolidColorBrush(Colors.Gray);

}


private void IntegerUpDown_LostFocus(object sender, RoutedEventArgs e)

{

    Day.Background = new SolidColorBrush(Colors.DarkGray);

}


查看完整回答
反对 回复 2022-07-23
?
DIEA

TA贡献1820条经验 获得超2个赞

在看到@JBD 的答案后,我编辑了 IntegerUpDown 控件的 ControlTemplate 以更改背面


<ControlTemplate x:Key="ControlControlTemplate1" TargetType="{x:Type Control}">

            <xctk:ButtonSpinner x:Name="PART_Spinner" AllowSpin="{Binding AllowSpin, RelativeSource={RelativeSource TemplatedParent}}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" ButtonSpinnerLocation="{Binding ButtonSpinnerLocation, RelativeSource={RelativeSource TemplatedParent}}" Background="{TemplateBinding Background}" HorizontalContentAlignment="Stretch" IsTabStop="False" ShowButtonSpinner="{Binding ShowButtonSpinner, RelativeSource={RelativeSource TemplatedParent}}" VerticalContentAlignment="Stretch">

                <xctk:WatermarkTextBox x:Name="PART_TextBox" AutoMoveFocus="{Binding AutoMoveFocus, RelativeSource={RelativeSource TemplatedParent}}" AutoSelectBehavior="{Binding AutoSelectBehavior, RelativeSource={RelativeSource TemplatedParent}}" AcceptsReturn="False" BorderThickness="0" ContextMenu="{TemplateBinding ContextMenu}" Foreground="{TemplateBinding Foreground}" FontWeight="{TemplateBinding FontWeight}" FontStyle="{TemplateBinding FontStyle}" FontStretch="{TemplateBinding FontStretch}" FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" IsTabStop="True" IsUndoEnabled="True" MinWidth="20" MaxLength="{Binding MaxLength, RelativeSource={RelativeSource TemplatedParent}}" Padding="{TemplateBinding Padding}" TextAlignment="{Binding TextAlignment, RelativeSource={RelativeSource TemplatedParent}}" TextWrapping="NoWrap" TabIndex="{TemplateBinding TabIndex}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" WatermarkTemplate="{Binding WatermarkTemplate, RelativeSource={RelativeSource TemplatedParent}}" Watermark="{Binding Watermark, RelativeSource={RelativeSource TemplatedParent}}">

                    <xctk:WatermarkTextBox.Style>

                        <Style TargetType="{x:Type xctk:WatermarkTextBox}">

                            <Setter Property="Background" Value="{StaticResource DarkGreyBrush}" />

                            <Style.Triggers>

                                <Trigger Property="IsFocused" Value="True">

                                    <Setter Property="Background" Value="{StaticResource LightGreyBrush}" />

                                </Trigger>

                            </Style.Triggers>

                        </Style>

                    </xctk:WatermarkTextBox.Style>

                </xctk:WatermarkTextBox>


            </xctk:ButtonSpinner>

            <ControlTemplate.Triggers>

                <Trigger Property="IsMouseOver" Value="True">

                    <Setter Property="BorderBrush" Value="{DynamicResource {ComponentResourceKey ResourceId=ControlMouseOverBorderKey, TypeInTargetAssembly={x:Type Themes:ResourceKeys}}}"/>

                </Trigger>

                <MultiDataTrigger>

                    <MultiDataTrigger.Conditions>

                        <Condition Binding="{Binding IsReadOnly, RelativeSource={RelativeSource Self}}" Value="False"/>

                        <Condition Binding="{Binding AllowTextInput, RelativeSource={RelativeSource Self}}" Value="False"/>

                    </MultiDataTrigger.Conditions>

                    <Setter Property="IsReadOnly" TargetName="PART_TextBox" Value="True"/>

                </MultiDataTrigger>

                <DataTrigger Binding="{Binding IsReadOnly, RelativeSource={RelativeSource Self}}" Value="True">

                    <Setter Property="IsReadOnly" TargetName="PART_TextBox" Value="True"/>

                </DataTrigger>

                <Trigger Property="IsKeyboardFocusWithin" Value="True">

                    <Setter Property="BorderBrush" Value="{DynamicResource {ComponentResourceKey ResourceId=ControlSelectedBorderKey, TypeInTargetAssembly={x:Type Themes:ResourceKeys}}}"/>

                </Trigger>

                <Trigger Property="IsEnabled" Value="False">

                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>

                </Trigger>

                <Trigger Property="IsFocused" Value="True">

                    <Setter Property="FocusManager.FocusedElement" TargetName="PART_TextBox" Value="{Binding ElementName=PART_TextBox}"/>

                    <Setter TargetName="PART_TextBox" Property="Visibility" Value="Hidden" />

                </Trigger>

            </ControlTemplate.Triggers>

        </ControlTemplate>

请查看控件模板的开头和 WatermarkTextBox。WatermarkTextBox.Style 是我添加的,用于在文本框获得焦点时更改背景。


要覆盖控制模板,请右键单击 IntegerUpDown 控件,然后按编辑模板


查看完整回答
反对 回复 2022-07-23
  • 3 回答
  • 0 关注
  • 195 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号