2012-04-10 3 views
0

Я новичок в этом, поэтому, пожалуйста, несите меня.Стиль кнопки WPF не отображает текст

У меня сейчас есть Style. Вставьте это в окно, чтобы увидеть его в действии.

<Window.Resources> 

<Style x:Key="SelectionButton3" 
     TargetType="{x:Type Button}"> 

    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 

       <Grid HorizontalAlignment="Stretch" 
         VerticalAlignment="Stretch" 
         ClipToBounds="False"> 

        <Grid.RowDefinitions> 
         <RowDefinition Height="75" /> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="100" /> 
         <ColumnDefinition Width="55" /> 
        </Grid.ColumnDefinitions> 

        <Border x:Name="TheBorder" 
          BorderThickness="0,1.5,1.5,1.5" 
          CornerRadius="3" 
          Background="SteelBlue" 
          Height="35" 
          Grid.Column="1" 
          Grid.Row="0" 
          Margin="-31" 
          BorderBrush="DarkSlateBlue"/> 

        <Rectangle Name="TheRectangle" 
           Fill="SteelBlue" 
           Stroke="DarkSlateBlue" 
           Grid.Row="0" 
           Grid.Column="0"> 

         <Rectangle.LayoutTransform> 
          <RotateTransform Angle="-45" /> 
         </Rectangle.LayoutTransform> 

         <Rectangle.BitmapEffect> 
          <DropShadowBitmapEffect ShadowDepth="5" /> 
         </Rectangle.BitmapEffect> 

        </Rectangle> 

        <ContentPresenter x:Name="ContentArea" 
             VerticalAlignment="Center" 
             HorizontalAlignment="Center" 
             Content="{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}}" /> 
       </Grid> 

       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" 
           Value="True"> 
         <Setter TargetName="TheBorder" 
           Property="BitmapEffect"> 
          <Setter.Value> 
           <DropShadowBitmapEffect ShadowDepth="0" /> 
          </Setter.Value> 
         </Setter> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 

    </Setter> 

    <Setter Property="Foreground" 
      Value="White"/> 
    <Setter Property="FontFamily" 
      Value="Segoe UI" /> 
    <Setter Property="FontSize" 
      Value="20" /> 

    </Style> 

<Grid.RowDefinitions> 
    <RowDefinition Height="20"/> 
    <RowDefinition Height="Auto"/> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="Auto" /> 
</Grid.RowDefinitions> 
<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="20"/> 
    <ColumnDefinition Width="250" /> 
</Grid.ColumnDefinitions> 

<Button Grid.Row="1" 
     Grid.Column="1" 
     Style="{StaticResource SelectionButton3}" 
     Margin="0,0,0,5" 
     Click="Button_Click"> 

    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="Auto" /> 
     </Grid.ColumnDefinitions> 

     <Image Height="35" 
       Width="35" 
       Stretch="Fill" 
       HorizontalAlignment="Center" 
       VerticalAlignment="Center" 
       Grid.Column="0" 
       Margin="32.5,0,0,0" 
       Source="/app;component/Media/Images/Mail/email.png" /> 

     <TextBlock Text="Email" 
        Grid.Column="1" 
        HorizontalAlignment="Center" 
        VerticalAlignment="Center" 
        Margin="22,0,0,0"/> 

    </Grid> 


</Button> 

У меня есть 2 вопроса:

1) Почему только часть текста, показывая вверх?

2) Как положить Image и TextBlock в Template и просто привязать их?

ответ

2

Причина, по которой ваш текст обрезается, заключается в том, что вы не указали Grid.Row и Grid.Column для своего ContentPresenter. Это приведет к тому, что содержимое вашей кнопки будет по умолчанию равно 0-й строке и 0-му столбцу на вашем ControlTemplate, что в сочетании с вашими полями и позициями приведет к отключению текстового блока на вашем элементе Button. Я предполагаю, что это может быть твоим намерением?

<ContentPresenter x:Name="ContentArea" 
    Grid.Column="0" 
    Grid.ColumnSpan="2" 
    Grid.Row="0" 
    VerticalAlignment="Stretch" 
    HorizontalAlignment="Stretch" 
    Content="{Binding Path=Content, 
      RelativeSource={RelativeSourceTemplatedParent}}" /> 

ContentPresenter Теперь будет охватывать обе колонки на ControlTemplate «s Grid, так что ваш TextBlock будет иметь больше места для отображения себя.

Чтобы ответить на ваш второй вопрос How do I put the Image and Textblock in the template and just bind to them?

Один из способов сделать это является подкласс Button класс, назовем его MyImageButton, например, и реализовать два новых свойства зависимостей называется Image и Text в этом новом классе. Затем вы можете переместить <Image> и <TextBlock> в свой шаблон управления и связать их с новыми Image и Text. Затем вы можете создать экземпляр MyImageButton и использовать новые свойства, чтобы установить изображение и текст кнопки.

+0

Именно так. благодаря – CoderForHire

Смежные вопросы