Содержимое кнопки XAML не отображается при применении шаблона - PullRequest
0 голосов
/ 30 октября 2018

Я пробую этот пользовательский код шаблона для каждого элемента управления, и вторая кнопка в моей сетке не соответствует его содержанию. Вот мой фрагмент кода.

'<Grid>  
  <Grid.ColumnDefinitions>
     <ColumnDefinition Width="*"/>
     <ColumnDefinition Width="Auto"></ColumnDefinition>         
  </Grid.ColumnDefinitions>      
  <Grid.Resources>
     <!-- First Template -->
     <ControlTemplate x:Key="TBtnOpen" TargetType="{x:Type Button}">
        <Border x:Name="Border" CornerRadius="4">
           <Border.Background><!-- Default Diagonal Gradient-->
              <LinearGradientBrush>
                 <GradientStop Color="DarkGreen" Offset="0"/>
                 <GradientStop Color="LightGreen" Offset="0.5"/>
                 <GradientStop Color="DarkBlue" Offset="1"/>        
              </LinearGradientBrush>
           </Border.Background>
           <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" />
        </Border>
     </ControlTemplate>
     <!-- Second Template -->
     <ControlTemplate x:Key="TBtnCloseHor" TargetType="{x:Type Button}">
        <Border x:Name="Border" CornerRadius="8">
           <Border.Background>
              <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5"> <!-- Horizontal Gradient-->
                 <GradientStop Color="Violet" Offset="0"></GradientStop>
                 <GradientStop Color="LightBlue" Offset="0.2"></GradientStop>
                 <GradientStop Color="DarkGreen" Offset="0.4"></GradientStop>
                 <GradientStop Color="Red" Offset="0.6"></GradientStop>
                 <GradientStop Color="Yellow" Offset="0.8"></GradientStop>
                 <GradientStop Color="DarkOrange" Offset="1"></GradientStop>
              </LinearGradientBrush>
           </Border.Background>
        </Border>
     </ControlTemplate>
     <!-- Controls Styles -->
     <Style x:Key="BtnStyles" TargetType="Button">
        <Setter Property="Height" Value="40"></Setter>
        <Setter Property="Width" Value="100"></Setter>
        <Setter Property="FontSize" Value="25"></Setter>
        <Setter Property="FontStyle" Value="Italic"></Setter>
        <Setter Property="FontFamily" Value="Arial"></Setter>
        <Setter Property="FontWeight" Value="Bold"></Setter>
     </Style>
  </Grid.Resources>  
  <Button  Grid.Column="0" x:Name="btnFirst"  HorizontalAlignment="Left" 
           Style="{StaticResource BtnStyles}"
           Template="{StaticResource TBtnOpen}">Open!
    <Button.Margin>10</Button.Margin>        
    <Button.Foreground>Black</Button.Foreground>        
  </Button>  
  <Button Grid.Column="1" x:Name="btnSecond" HorizontalAlignment="Right" 
          Style="{StaticResource BtnStyles}" Template="{StaticResource TBtnCloseHor}">Close!<!-- This is the missing Content-->
     <Button.Margin>10</Button.Margin>  
     <Button.Foreground>White</Button.Foreground>         
  </Button>  </Grid>'

Если применить один и тот же шаблон (TBtnOpen) к обоим элементам управления кнопкой, он работает нормально, но применяя различные шаблоны, каждый из которых скрывает вторую кнопку Content. Любые советы будут высоко ценится. Спасибо Тони.

PS: пример изображения по ссылке ниже. введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

При использовании пользовательского шаблона необходимо указать <ContentPresenter/>, иначе WPF не поймет, куда должен идти контент. Таким образом, попробуйте добавить его в свой пользовательский шаблон, и ваш контент будет отображаться, даже если вы не укажете VerticalAlignment и HorizontalAlignment

            <ControlTemplate x:Key="TBtnCloseHor" TargetType="{x:Type Button}">
            <Border x:Name="Border" CornerRadius="8">
            <ContentPresenter/>
                <Border.Background>
                    <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
                        <!-- Horizontal Gradient-->
                        <GradientStop Color="Violet" Offset="0"></GradientStop>
                        <GradientStop Color="LightBlue" Offset="0.2"></GradientStop>
                        <GradientStop Color="DarkGreen" Offset="0.4"></GradientStop>
                        <GradientStop Color="Red" Offset="0.6"></GradientStop>
                        <GradientStop Color="Yellow" Offset="0.8"></GradientStop>
                        <GradientStop Color="DarkOrange" Offset="1"></GradientStop>
                    </LinearGradientBrush>
                </Border.Background>
            </Border>
        </ControlTemplate>
0 голосов
/ 31 октября 2018

Я не знаю, что вызывает это, но я знаю, как это исправить. Вы должны связать содержимое Границы.

Напишите это в своих границах:

<ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/>
...