我注意到当Text
通过代码动态更改时,TextBox非常慢,并且会产生性能问题(我需要同时将Text
连续更改为10-15个TextBox) ,因此,作为一种解决方法,我创建了一个包含TextBlock
和TextBox
的自定义控件:
TextBlock
几乎一直使用。
TextBox
仅在需要使用键盘在控件内编辑Text
时使用。
我的解决方案是更改模板并在控件集中时使用TextBox:
({Value
是string
依赖项属性)
<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,而控件丢失了“焦点状态”。
有没有更好的方法来创建这样的自定义“文本框”控件,或者解决此问题的方法?
答案 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>