none
在控件的事件中使一个IsEnabled为false的textbox的IsEnabled设为true,并强制获得焦点。失去焦点并再次触发此控件的事件时,事件代码的内容无效,如何解决? RRS feed

  • 问题

  • <Button x:Name="btn1" Content="获得焦点" Margin="94,155,462,372" Click="Btn1_Click" />
    <TextBox Name="textblock"  FontSize="25" Style="{StaticResource TextBlockBox}" Text="sdf"   Margin="475,248,23,261" />


    private void Btn1_Click(object sender, RoutedEventArgs e)
            {
                textblock.IsEnabled = true;
                textblock.Focus();
            }
    <ControlTemplate x:Key="TextBlockBoxTemplate" TargetType="{x:Type TextBox}">
    
            <Border x:Name="InnerBorder"  Background="{TemplateBinding Background}"  BorderBrush="{TemplateBinding BorderBrush}"  BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="0">
                <Grid>
                    <ScrollViewer Foreground="Red"  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" x:Name="PART_ContentHost"/>
                </Grid>
            </Border>
            <ControlTemplate.Triggers>
                <Trigger  Property="IsKeyboardFocused" Value="True">
                    <Setter Property="IsEnabled"  Value="true"/>
                </Trigger>
                <Trigger Property="IsEnabled" Value="true">
                    <Setter TargetName="InnerBorder" Property="Background" Value="green" />
                    <Setter Property="BorderBrush"  Value="red"/>
                </Trigger>
                <EventTrigger RoutedEvent="TextBox.LostFocus">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="(TextBox.IsEnabled)">
                                    <BooleanKeyFrameCollection>
                                        <DiscreteBooleanKeyFrame Value="False" KeyTime="0:0:0"/>
                                    </BooleanKeyFrameCollection>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    <Style x:Key="TextBlockBox" TargetType="{x:Type TextBox}">
            <Setter Property="Background" Value="Transparent" />
            <Setter Property="Foreground" Value="black"></Setter>
            <Setter Property="IsEnabled" Value="False"></Setter>
            <Setter Property="BorderBrush" Value="Transparent"></Setter>
            <Setter Property="BorderThickness" Value="2"></Setter>
            <Setter Property="FontSize" Value="12"/>
            <Setter Property="Padding" Value="5"/>
            <Setter Property="Template" Value="{StaticResource TextBlockBoxTemplate}"></Setter>
        </Style>

    想要设计一个TextBox,默认状态下IsEnabled为false,背景色和边框色透明,像一个TextBlock。通过其他控件的事件来使该textBox的IsEnabled为true,使其强制获得焦点,让用户看起来像输入框的样子,

    ,如上述按钮的点击事件内容的代码,第一次事件被触发时,TextBox的IsEnabled为true,并且强制获得焦点,当失去焦点时,失去焦点的事件触发器会使TextBox的IsEnabled为false。

    但是再次点击按钮时,已经无效,而且在点击事件里用MessageBox输出IsEnabled的内容不是true,而是false,这是怎么回事。如何解决这个问题。

    而且还有一个显示问题,获得焦点的TextBox里的竖着的光线没有,这个是哪里出了问题?如何解决



    2019年1月24日 10:13

答案

  • 关于游标的问题

    我这里则是没有问题的

    关于事件触发的问题

    请参考

    EventTrigger Class

    其中有


    也就是说Event的动画是默认冻结的,之后是无法修改了

    WPF体够几种关于情节动画的后置控制手段 不过都不符合题主的要求。

    至于解决办法也是很简单 通过C#代码来控制

      private int b = 0;
      private void Btn1_Click(object sender, RoutedEventArgs e)
            {
              
                switch (b<2)
                {
                    case true:
                        textblock.IsEnabled = true;
                        textblock.Focus();
                        textblock.Text =$"Test {b}:Code";
                        break;
                    case false:
                        textblock.Text = $"Test {b}:Ani";
                        //创建动画
                        BooleanAnimationUsingKeyFrames frames = new BooleanAnimationUsingKeyFrames();
                        frames.KeyFrames.Add(new DiscreteBooleanKeyFrame(true, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0))));
                        textblock.BeginAnimation(TextBox.IsEnabledProperty, frames);                 
                        break;
                }
                b++;
            }







    2019年1月24日 13:41