Забавно, что вы использовали DockPanel в качестве замены XAML для изображения в своем посте. :) Я думаю это действительно то, что вы хотите здесь - DockPanel с верхней частью, которая масштабирует ее содержимое, и нижней частью, которая этого не делает.
Ключом является добавление контейнера изображений в DockPanel последним, чтобы ему автоматически предоставлялась оставшаяся часть экрана. И установите для его свойства Dock значение "Top".
например. (Я не проверял это, кстати. Я просто думаю, что это будет работать немного лучше, чем я писал ранее)
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<!-- put LeftMarginConverter here -->
</Page.Resources>
<DockPanel>
<TabControl DockPanel.Dock="Bottom" Margin="{Binding ImageX, Converter={StaticResource LeftMarginConverter}}">
<TabItem Header="Some text here" />
</TabControl>
<Canvas DockPanel.Dock="Top">
<Image Canvas.Left="{Binding ImageX}">
<!-- image goes here -->
</Image>
</Canvas>
</DockPanel>
</Page>
Таким образом, идея заключается в том, что позиция вашего изображения на холсте привязана к свойству в выделенном коде. Аналогично, свойство Margin
TabControl связано с этим же свойством. Но чтобы его использовать, вам нужно написать IValueConverter
в коде позади, и этот преобразователь примет значение ImageX
и вернет новый объект Thickness
, который использует ImageX
в качестве левого поля.
, например
public class LeftMarginConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int left_margin = object as int;
return new Thickness( left_margin,0,0,0);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// we aren't ever going to need to convert back for this formatter!
return null;
}
#endregion
}