Xaml在TextBlock和TextBox之间切换

问题描述 投票:0回答:1

我注意到TextBoxes非常慢并且当代码动态更改Text时会产生性能问题(我需要同时将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,并且控件失去了“焦点状态”。

有一种更好的方法来创建这样的自定义“TextBox”控件,或者解决此问题的方法?

wpf performance textbox focus textblock
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.