Cómo obtener el contenido del botón para llenar el ancho en WPF

En el siguiente XAML, el botón se estirará para adaptarse al ancho de la ventana, incluso cuando cambie el tamaño de la ventana. Sin embargo, TextBlock y el cuadro azul están centrados. ¿Cómo lo cambiaría para que: 1) el TextBlock esté dentro del Botón, pero a la izquierda justificado con el ancho real del Botón (es decir, en el lado izquierdo de la Ventana) 2) el Lienzo está dentro del Botón, pero justificado a la derecha con el Ancho real del botón (es decir, en el lado derecho de la ventana)

Parece que "HorizontalAlignment = Stretch" no funciona en este caso y, cuando se usa el dimensionamiento automático, la cuadrícula dentro del botón solo crece hasta el ancho mínimo necesario para su contenido.

<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>

Respuestas a la pregunta(1)

Su respuesta a la pregunta