Вот как бы я это сделал: -
<Grid MinWidth="800">
<Rectangle x:Name="Background" Fill="Green" Width="{Binding PercentDone, Converter={StaticConverter WidthConv}, ConverterParameter=800}" HorizontalAlignment="Left" />
<Grid Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Image Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Top" Source="{Binding Occurrence.Appointment.Icon, Converter={StaticResource imgConverter}}" Width="16" Height="16" Stretch="Fill" />
<TextBlock Grid.Column="1" HorizontalAlignment="Left" MaxWidth="130" Text="{Binding Occurrence.Appointment.Subject}" />
</Grid>
</Grid>
Где WidthConv
- это экземпляр класса, добавленного к ресурсам usercontrol, который реализует IValueConverter
. Метод Convert
будет принимать входное процентное значение и применять его к параметру, чтобы вернуть ширину, которой должен быть прямоугольник, для представления этого процентного значения.
Важным моментом здесь является то, что Grid
естественным образом накладывает элементы друг на друга, когда занимают одну и ту же область.