我注意到TextBoxes非常慢并且当代码动态更改Text
时会产生性能问题(我需要同时将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,并且控件失去了“焦点状态”。
有一种更好的方法来创建这样的自定义“TextBox”控件,或者解决此问题的方法?
您不需要为此设置自定义控件,这只会增加不必要的开销。您要创建的内容仍然是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>