Есть Canvas, на нем есть две вертикальные линии, которые обозначают отступы: левый и правый.
Эти отступы в миллиметрах можно задавать через NumericUpDown котролы.
Так как у нас на экране пикселы, то использую IValueConverter для биндинга значения NumericUpDown к значению X линий.
Но возник вопрос: для левой границы можно сразу забиндить NumericUpDown.Value через конвертер примерно так:
Line X1="{Binding ElementName=leftMargin, Path=Value, Converter={StaticResource MMtoPixelConverter}}"
а вот для правой границы необходимо перевести миллиметры в пикселы и отнять это значение от ширины Canvas.
Хотелось бы иметь чтото типа:
Line X1="mainCanvas.Width — {Binding ElementName=leftMargin, Path=Value, Converter={StaticResource MMtoPixelConverter}}"
но это не работает.
Сейчас решил вопрос другим конвертером — спец конвертер для левой и нижней границ. И задумался — а можно ли както проще?
вариантов море. ваше решение не будет работать с ресайзом. может, имеет смысл посмотреть в сторону Margin.Left & Margin.Right, или управлять Padding'om самого контейнера instead?
Вычисления можно проводить, но это велосипед с парсингом в Expression tree и/или использованием MultiBinding'a для передачи контекстного DependencyObject'a.
Вы поймите, одним из главным преимуществ WPF являются авто лейаут. В вашем случае вы игнорируете его и пытаетесь сделать вещи на очень низком уровне. Line один из тупейших сюрфейсных элементов.
Смотрите — вы используете линии для бордюров, линии очевидно будут выступатъ границами для содержимого вашего Canvas. Потом вам предется писать код для вписывания содержимого внутрь бордюров.
Вот то, что хотите вы с использованием лейаутов. Конвертер должен отдавать Margin, ConverterParameter — Left, Right в зависимости от которых вы бутете выставлять соответствующую компоненту Margin'a.
Я приделал
пример того, как это можно сделать.
Здравствуйте, DmitryMS, Вы писали:
DMS>Я приделал пример того, как это можно сделать.
Зачетный поучительный пример. Спасибо
Enjoy. Here's another one for you, full codeless now:
<Grid>
<Border BorderBrush="Gray" BorderThickness="1" Margin="10">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20" />
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="20" />
</Grid.ColumnDefinitions>
<Grid Background="Gray" Grid.Column="0"></Grid>
<GridSplitter Background="LightGray" ResizeDirection="Columns" Grid.Column="0" Height="Auto" Width="4" VerticalAlignment="Stretch" Margin="0"/>
<Grid Background="White" Grid.Column="1">
<TextBlock Padding="10" TextWrapping="Wrap" HorizontalAlignment="Center" VerticalAlignment="Center" Text="Long Wrappable Content goes here..."></TextBlock>
</Grid>
<GridSplitter Background="LightGray" ResizeDirection="Columns" Grid.Column="1" Height="Auto" Width="4" VerticalAlignment="Stretch" Margin="0"/>
<Grid Background="Gray" Grid.Column="2"></Grid>
</Grid>
</Border>
</Grid>