Xaml переключатель между TextBlock и TextBox - PullRequest
0 голосов
/ 04 марта 2019

Я заметил, что TextBox-ы очень медленные и создают проблемы с производительностью, когда 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», подобный этому, или способ решить эту проблему?

1 Ответ

0 голосов
/ 05 марта 2019

Вам не нужен настраиваемый элемент управления для этого, это просто добавление ненужных накладных расходов.То, что вы пытаетесь создать, - это все еще 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

...