Интервал добавляется при динамическом переключении шаблона управления - PullRequest
1 голос
/ 08 января 2020

Я реализовал переключение TextBox с TextBlock при нажатии. Моя цель состояла в том, чтобы показать ..., когда текст становится шире, чем TextBox width Я следовал этому ответу, чтобы найти решение . Это мой текущий код:

<TextBox x:Name="TextBox" Height="24" Width="300" Cursor="Hand" BorderThickness="0"  Background="White"  VerticalAlignment="Center" Text="{Binding MyCustomText}">
<TextBox.Style>
    <Style TargetType="TextBox">
        <Setter Property="Background" Value="Yellow" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsKeyboardFocused, RelativeSource={RelativeSource Self}}" Value="false">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="TextBox">
                            <TextBlock Height="24" Text="{TemplateBinding Text}" TextTrimming="CharacterEllipsis" />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</TextBox.Style>

К моему удивлению, при нажатии на TextBlock происходит небольшой скачок. Взгляните:

enter image description here

Я не применяю Padding или Margin. Почему причина этого перехода?

ОБНОВЛЕНИЕ: Шаблон элемента управления TextBox по умолчанию, извлеченный с кодом:

<?xml version="1.0" encoding="utf-16"?>
<ControlTemplate TargetType="TextBoxBase" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:s="clr-namespace:System;assembly=mscorlib">
  <Border BorderThickness="{TemplateBinding Border.BorderThickness}" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" Name="border" SnapsToDevicePixels="True">
    <ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" Name="PART_ContentHost" Focusable="False" />
  </Border>
  <ControlTemplate.Triggers>
    <Trigger Property="UIElement.IsEnabled">
      <Setter Property="UIElement.Opacity" TargetName="border">
        <Setter.Value>
          <s:Double>0.56</s:Double>
        </Setter.Value>
      </Setter>
      <Trigger.Value>
        <s:Boolean>False</s:Boolean>
      </Trigger.Value>
    </Trigger>
    <Trigger Property="UIElement.IsMouseOver">
      <Setter Property="Border.BorderBrush" TargetName="border">
        <Setter.Value>
          <SolidColorBrush>#FF7EB4EA</SolidColorBrush>
        </Setter.Value>
      </Setter>
      <Trigger.Value>
        <s:Boolean>True</s:Boolean>
      </Trigger.Value>
    </Trigger>
    <Trigger Property="UIElement.IsKeyboardFocused">
      <Setter Property="Border.BorderBrush" TargetName="border">
        <Setter.Value>
          <SolidColorBrush>#FF569DE5</SolidColorBrush>
        </Setter.Value>
      </Setter>
      <Trigger.Value>
        <s:Boolean>True</s:Boolean>
      </Trigger.Value>
    </Trigger>
  </ControlTemplate.Triggers>
</ControlTemplate>

Я полностью удалил границу и применил стиль к каждому Текстовое окно. Прыжки сохраняются

//merged dictionary 
    <ControlTemplate x:Key="CustomTextBox" TargetType="TextBoxBase" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:s="clr-namespace:System;assembly=mscorlib">
            <ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" Name="PART_ContentHost" Focusable="False" />
    // triggers
    </ControlTemplate>
    <Style TargetType="TextBox">
        <Setter Property="TextBox.Template" Value="{StaticResource CustomTextBox}"></Setter>
    </Style>

Обновление: Видимо Margin="2 0 0 0" на TextBlock - это число волхвов c.

...