WPF привязка IValueConverter и ширина другого элемента управления - PullRequest
0 голосов
/ 24 января 2011

Следующий код работал нормально. В другом месте кода была ошибка. Тем не менее, данный совет хорош.


Я пытаюсь связать Width из TextBox с процентом от Width родительского элемента управления. Я знаю, что могу сделать нечто подобное, просто установив Margin, но мне было интересно, почему это не работает.

Сначала я установил ссылку на IValueConverter в коллекции ресурсов моего пользовательского элемента управления:

<UserControl.Resources>
    <local:TextBoxWidthConverter x:Key="txtWidthConv" />
</UserControl.Resources>

В основном xaml у меня есть следующее:

<StackPanel Name="parentPanel" Width="300">
  <ScrollViewer HorizontalScrollBarVisibility="Auto"    
       VerticalScrollBarVisibility="Hidden" Name="scroller" Width="{Binding Width,    
       ElementName=parentPanel, Converter={StaticResource txtWidthConv}}">           
     <StackPanel Orientation="Horizontal">
       <TextBox></TextBox>
     </StackPanel>
   </ScrollViewer>
</StackPanel>

ivalueconverter выглядит так:

public class TextBoxWidthConverter : IValueConverter
{

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double result = (double)value;

        if (!Double.IsNaN(result))
        {
            result = result * .25;
        }
        else
        {
            result = 100D;
        }

        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new System.NotImplementedException("Not implemented.");
    }

    #endregion
}

Установка свойства width здесь ничего не делает, не говоря уже о настройке IValueConverter. Я бы ожидал, что ScrollViewer будет 1/4 ширины родителя StackPanel.

Ответы [ 2 ]

2 голосов
/ 24 января 2011

Пусть система верстки работает для вас, а не борется с ней. Сетка автоматически обрабатывает относительные размеры:

<StackPanel Name="parentPanel" Width="300">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition />
      <ColumnDefinition Width="3*" />
    </Grid.ColumnDefinitions>

    <ScrollViewer HorizontalScrollBarVisibility="Auto"    
       VerticalScrollBarVisibility="Hidden" Name="scroller">           
      <StackPanel Orientation="Horizontal">
        <TextBox></TextBox>
      </StackPanel>
    </ScrollViewer>
  </Grid>
</StackPanel>
1 голос
/ 24 января 2011

Установите для ScrollViewer HorizontalAlignment значение, отличное от Stretch.

Кроме того, следует связать со свойством ActualWidth .

...