Не можете связать свойство Margin? - PullRequest
2 голосов
/ 04 февраля 2011

Я пытаюсь создать что-то вроде анимационного фильма, где в данный момент видно только одно из его полей.Как кинопленка в камере - только одно поле пленки в настоящее время размещено под объективом и готово для освещения.Я пытаюсь добиться этого как сетка с другой сеткой.«Кинолента» называется pageContainer в приведенном ниже коде.В коде позади я делаю анимацию, которая изменяет свойство Margin сетки pageContainer.Работает отлично, pageContainer приятно скользит влево или вправо, как я хочу.Например: чтобы показать номер страницы.2 маржа установлена ​​на (-270,0,0,0) вместо (0,0,0,0).Это перемещает pageContainer влево, и вместо первого видно только второе поле.

Однако, как только я начинаю изменять размер всего пользовательского интерфейса, этот механизм перестает работать, и пользователь может видеть границу между двумястраницы (поля) вместо только текущей.Если я ставлю точку останова на свой pageWidthConverter, он всегда срабатывает при изменении размера всего пользовательского интерфейса.Если я добавлю другую точку останова на pageMarginConverter, она никогда не будет достигнута во время изменения размера.Зачем?Я хотел бы сделать свойство Margin зависимым от BackgroundRectangle ActualWidth так же, как я сделал это со свойством Width.Но это не работает.Почему Width динамически устанавливается при изменении размера окна, но Margin - это не *

PS: вместо Margin можно использовать TranslateTransform.Я пытался, но безуспешно.

Если кто-то может помочь, это будет очень высоко оценено.

Приветствия Ганс

        ... <Grid Grid.Row="3" Grid.Column="1" Margin="0,-4,0,0" ClipToBounds="True">
                <Grid x:Name="pageContainer"
                      Width="{Binding Converter={StaticResource pageWidthConvertor}, ElementName=BackgroundRectangle, Path=ActualWidth}"
                      Margin="{Binding Converter={StaticResource pageMarginConvertor}, ElementName=BackgroundRectangle, Path=ActualWidth}" >

                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="{Binding ElementName=BackgroundRectangle, Path=ActualWidth}"/>
                        <ColumnDefinition Width="40"/>
                        <ColumnDefinition Width="{Binding ElementName=BackgroundRectangle, Path=ActualWidth}"/>
                        <ColumnDefinition Width="40"/>
                        <ColumnDefinition Width="{Binding ElementName=BackgroundRectangle, Path=ActualWidth}"/>
                        <ColumnDefinition Width="40"/>
                        <ColumnDefinition Width="{Binding ElementName=BackgroundRectangle, Path=ActualWidth}"/>
                        <ColumnDefinition Width="40"/>
                    </Grid.ColumnDefinitions> ...

1 Ответ

2 голосов
/ 04 февраля 2011

Звучит так, как будто вы хотите, чтобы ваша маржа зависела от двух вещей: (1) желаемого смещения и (2) некоторой доли вашего ActualWidth, чтобы ваш пользовательский интерфейс масштабировался хорошо.Вы пытались использовать MultiBinding?Взгляните на следующую статью:

http://www.codeproject.com/KB/WPF/WpfWinFormsBulletGraphs.aspx#layout

При этом используется мультисвязывание для масштабирования некоторого значения в зависимости от размера элемента управления.Вот мульти-связывание:

class ScalingMultiConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, 
            object parameter, CultureInfo culture)
    {
        if (!ValuesPopulated(values))
            return 0.0;

        double containerWidth = (double)values[2];
        double valueToScale = (double)values[1];
        double maximum = (double)values[0] ;

        return valueToScale * containerWidth / maximum;
    }

    private bool ValuesPopulated(object[] values)
    {
        foreach (object value in values)
        {
            if (value==null || value.Equals(DependencyProperty.UnsetValue))
                return false;
        }
        return true;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, 
                object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

И пример его использования:

<Rectangle.Width>
    <MultiBinding Converter="{StaticResource ScalingMultiConverter}">
        <Binding Path="(c:BulletGraphWithLegend.GraphRange)"/>
        <Binding Path="(c:BulletGraphWithLegend.FeaturedMeasure)"/>
        <Binding Path="ActualWidth"/>
    </MultiBinding>
</Rectangle.Width>

Вы сможете создать мульти-привязку, которая принимает желаемое смещение и ActualWidth.и преобразует его в поле.

В другом примечании, почему бы не обернуть вашу сетку в Canvas и расположить ее через свойство Canvas.Left?Таким образом, вам не нужно будет создавать толщину в вашем конвертере.

...