[WPF] Как использовать такой ValueConverter
От: skodnik  
Дата: 07.01.11 09:14
Оценка:
Есть 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}}"
но это не работает.
Сейчас решил вопрос другим конвертером — спец конвертер для левой и нижней границ. И задумался — а можно ли както проще?
Re: [WPF] Как использовать такой ValueConverter
От: DmitryMS  
Дата: 07.01.11 10:00
Оценка: +1
вариантов море. ваше решение не будет работать с ресайзом. может, имеет смысл посмотреть в сторону Margin.Left & Margin.Right, или управлять Padding'om самого контейнера instead?
Re[2]: [WPF] Как использовать такой ValueConverter
От: skodnik  
Дата: 07.01.11 10:06
Оценка:
Здравствуйте, DmitryMS, Вы писали:

DMS>вариантов море. ваше решение не будет работать с ресайзом. может, имеет смысл посмотреть в сторону Margin.Left & Margin.Right, или управлять Padding'om самого контейнера instead?


За подсказку спасибо. Но вот можно ли както в биндинге еще и вычисления производить?
Re[3]: [WPF] Как использовать такой ValueConverter
От: DmitryMS  
Дата: 07.01.11 11:35
Оценка: 3 (1)
Вычисления можно проводить, но это велосипед с парсингом в Expression tree и/или использованием MultiBinding'a для передачи контекстного DependencyObject'a.

Вы поймите, одним из главным преимуществ WPF являются авто лейаут. В вашем случае вы игнорируете его и пытаетесь сделать вещи на очень низком уровне. Line один из тупейших сюрфейсных элементов.

Смотрите — вы используете линии для бордюров, линии очевидно будут выступатъ границами для содержимого вашего Canvas. Потом вам предется писать код для вписывания содержимого внутрь бордюров.

Вот то, что хотите вы с использованием лейаутов. Конвертер должен отдавать Margin, ConverterParameter — Left, Right в зависимости от которых вы бутете выставлять соответствующую компоненту Margin'a.

Я приделал пример того, как это можно сделать.
Re[4]: [WPF] Как использовать такой ValueConverter
От: skodnik  
Дата: 07.01.11 12:05
Оценка:
Здравствуйте, DmitryMS, Вы писали:


DMS>Я приделал пример того, как это можно сделать.

Зачетный поучительный пример. Спасибо
Re[5]: [WPF] Как использовать такой ValueConverter
От: DmitryMS  
Дата: 07.01.11 12:45
Оценка: 2 (1)
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>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.