Xaml在TextBlock和TextBox之间切换

时间:2019-03-04 17:26:17

标签: wpf performance textbox focus textblock

我注意到当Text通过代码动态更改时,TextBox非常慢,并且会产生性能问题(我需要同时将Text连续更改为10-15个TextBox) ,因此,作为一种解决方法,我创建了一个包含TextBlockTextBox的自定义控件:

  

TextBlock几乎一直使用。
  TextBox仅在需要使用键盘在控件内编辑Text时使用。

我的解决方案是更改模板并在控件集中时使用TextBox:

({Valuestring依赖项属性)

<Style TargetType="{x:Type local:CustomControl1}">

    <Setter Property="Value" Value="Val"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{TemplateBinding Value}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

    <Style.Triggers>
        <Trigger Property="IsFocused" Value="True">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                        <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                            <TextBox HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
                                     Text="{Binding Path=Value, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>  

但是当我单击控件时,什么也没有发生。
我认为问题在于“焦点状态”传递给内部TextBox,而控件丢失了“焦点状态”。

有没有更好的方法来创建这样的自定义“文本框”控件,或者解决此问题的方法?

1 个答案:

答案 0 :(得分:1)

您不需要为此的自定义控件,这只是增加了不必要的开销。您尝试创建的仍然是TextBox,具有TextBox的所有常规行为(焦点等)。您需要做的就是在模板不清晰时将其更改为TextBlock:

<Window.Resources>

    <Style TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <Trigger Property="IsFocused" Value="False">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type TextBox}">
                            <TextBlock Text="{TemplateBinding Text}" />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>

</Window.Resources>

<StackPanel>
    <TextBox Text="Hello World" />
    <TextBox Text="Goodbye World" />
</StackPanel>

enter image description here