2015-07-27 10 views
5

Im folgenden XAML wird die Schaltfläche an die Breite des Fensters angepasst, einschließlich der Größe des Fensters. Der TextBlock und die blaue Box sind jedoch zentriert. Wie würden Sie es ändern, so dass: 1) der TextBlock ist innerhalb der Schaltfläche, aber links mit der tatsächlichen Breite der Schaltfläche (dh auf der linken Seite des Fensters) 2) der Canvas ist innerhalb der Schaltfläche, aber rechts ausgerichtet mit der tatsächlichen Tastenbreite (dh auf der rechten Seite des Fensters)So erhalten Sie Schaltflächeninhalt zum Füllen der Breite in WPF

Es scheint, "HorizontalAlignment = Stretch" funktioniert in diesem Fall nicht, und wenn Sie die automatische Größenanpassung verwenden, wächst das Raster innerhalb der Schaltfläche immer nur an die minimale Breite, die für seinen Inhalt benötigt wird.

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Name="Window" 
    Title="test" 
    Width="640" Height="480"> 

    <Grid x:Name="LayoutRoot"> 
     <Button Height="30"> 
      <Grid HorizontalAlignment="Stretch"> 
       <TextBlock Text="Sample Text" HorizontalAlignment="Stretch" TextAlignment="Left"></TextBlock> 
       <Canvas Width="40" Background="AliceBlue" HorizontalAlignment="Right"></Canvas> 
      </Grid> 
     </Button> 
    </Grid> 
</Window> 

Antwort

6

Sie sollten Button.Template setzen. Auch Grid.ColumnDefinitions kann verwendet werden, um die Position und Breite der Elemente richtig einzustellen.

 <Button Height="30" Content="Smaple text"> 
      <Button.Template> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Grid> 
         <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
          <Grid> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto"/> 
            <ColumnDefinition Width="*"/> 
           </Grid.ColumnDefinitions> 
           <ContentPresenter HorizontalAlignment="Left" Grid.Column="0" 
              VerticalAlignment="Center"/> 
           <Canvas Background="AliceBlue" Grid.Column="1" /> 
          </Grid> 
         </Border> 
        </Grid> 
       </ControlTemplate> 
      </Button.Template> 
     </Button> 
+0

Das funktioniert - danke! Können Sie erklären, warum es funktioniert? –

+0

Da, wenn Sie Elemente in Ihre Schaltfläche einfügen (wie Sie in Ihrer Frage getan haben), Sie tatsächlich "Button.Content" festlegen, aber was Sie tun wollten, war das Layout der Schaltfläche ändern und das kann durch Festlegen von "Button.Template" erreicht werden ". –