WPF: обертывание метки / TextBlock в прямоугольную рамку - PullRequest
0 голосов
/ 15 марта 2011

Я бы хотел нарисовать большое число на холсте, обернутом в прямоугольник, но я не знаю, как это сделать. Моя идея состоит в том, чтобы создать стиль и затем применить его к некоторому экземпляру Label, который меняет свой размер:

<Style x:Key="CountdownLabel" TargetType="Label">
<Setter Property="FontFamily" Value="Arial"></Setter>
<Setter Property="Foreground" Value="Navy"></Setter>
<Setter Property="FontWeight" Value="Bold"></Setter>
<Setter Property="FontSize" Value="40"></Setter>
<Setter Property="FontStretch" Value="UltraExpanded"></Setter>
<Setter Property="Control.Template">
    <Setter.Value>
        <ControlTemplate>
            <Border>
                <Rectangle Margin="0,0,0,0" Stroke="#60000000" StrokeThickness="1" StrokeDashArray="1 2" />
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>

Я установил label.Content=number.ToString() в коде позади, но номер не отображается. Кроме того, я не знаю, как изменить размер метки для заполнения родительского элемента Canvas.

Привет.

1 Ответ

0 голосов
/ 15 марта 2011

В шаблоне необходимо исправить две вещи:

  1. Вы не включили ContentPresenter, поэтому нет ничего, что могло бы сказать системе макетов: «О, кстати, вот где вы должны вставить то, что находится в свойстве Label's Content».
  2. Вам необходимо указать TargetType в ControlTemplate. (Просто одна из тех вещей, которые вы изучаете, когда шаблоны не работают.)

Вот исправленная версия, которая работает. Я изменил вашу границу на сетку, чтобы она могла вместить два дочерних элемента управления (прямоугольник для пунктирной границы и ContentPresenter для отображения содержимого). Я украл объявление ContentPresenter из примера на MSDN ; оно может быть неполным, но оно должно помочь вам начать работу.

<Style x:Key="CountdownLabel" TargetType="Label">
  <Setter Property="FontFamily" Value="Arial"/>
  <Setter Property="Foreground" Value="Navy"/>
  <Setter Property="FontWeight" Value="Bold"/>
  <Setter Property="FontSize" Value="40"/>
  <Setter Property="FontStretch" Value="UltraExpanded"/>
  <Setter Property="Control.Template">
    <Setter.Value>
      <ControlTemplate TargetType="Label">
        <Grid>
          <Rectangle Margin="0,0,0,0" Stroke="#60000000" StrokeThickness="1"
                     StrokeDashArray="1 2" MinWidth="10" MinHeight="10"/>
          <ContentPresenter
            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
            VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
            RecognizesAccessKey="True" />
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>
...