2012-05-10 5 views
1

Я связывании Width из TextBox к ActualWidth его содержащего Grid следующим образом:WPF конвертер странное поведение

<TextBlock 
    Grid.Column="0" 
    Text="WorkPortalView UserControl" 
    TextTrimming="CharacterEllipsis" 
    Foreground="White" 
    Margin="5" 
    Width="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Converter={StaticResource textWidthConverter}, diag:PresentationTraceSources.TraceLevel=High}" /> 

Как показано на рисунке, я использую конвертер, следующим образом:

class TextWidthConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      double? d = value as double?; 
      if (d == null) 
       return null; 

      return (d/2); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotSupportedException("Cannot convert back"); 
     } 
    } 

Странно, что показанный код работает нормально. Однако, если я заменил оператор return (d/2) на return (d - 75D), он, похоже, отправил бесконечный цикл изменений свойств.

Вот выход из диагностики трассировки тег для г/2:

System.Windows.Data Warning: 71 :  Lookup ancestor of type Grid: queried Grid (hash=19487651) 
System.Windows.Data Warning: 70 : RelativeSource.FindAncestor found Grid (hash=19487651) 
System.Windows.Data Warning: 76 : BindingExpression (hash=35097890): Activate with root item Grid (hash=19487651) 
System.Windows.Data Warning: 106 : BindingExpression (hash=35097890): At level 0 - for Grid.ActualWidth found accessor DependencyProperty(ActualWidth) 
System.Windows.Data Warning: 102 : BindingExpression (hash=35097890): Replace item at level 0 with Grid (hash=19487651), using accessor DependencyProperty(ActualWidth) 
System.Windows.Data Warning: 99 : BindingExpression (hash=35097890): GetValue at level 0 from Grid (hash=19487651) using DependencyProperty(ActualWidth): '417.6' 
System.Windows.Data Warning: 78 : BindingExpression (hash=35097890): TransferValue - got raw value '417.6' 
System.Windows.Data Warning: 80 : BindingExpression (hash=35097890): TransferValue - user's converter produced '208.8' 
System.Windows.Data Warning: 87 : BindingExpression (hash=35097890): TransferValue - using final value '208.8' 

Вот выход из диагностики трассировки теге D - 75D:

System.Windows.Data Warning: 94 : BindingExpression (hash=58235710): Got PropertyChanged event from Grid (hash=43090134) for ActualWidth 
System.Windows.Data Warning: 99 : BindingExpression (hash=58235710): GetValue at level 0 from Grid (hash=43090134) using DependencyProperty(ActualWidth): '429.6' 
System.Windows.Data Warning: 78 : BindingExpression (hash=58235710): TransferValue - got raw value '429.6' 
System.Windows.Data Warning: 80 : BindingExpression (hash=58235710): TransferValue - user's converter produced '354.6' 
System.Windows.Data Warning: 87 : BindingExpression (hash=58235710): TransferValue - using final value '354.6' 
System.Windows.Data Warning: 94 : BindingExpression (hash=58235710): Got PropertyChanged event from Grid (hash=43090134) for ActualWidth 
System.Windows.Data Warning: 99 : BindingExpression (hash=58235710): GetValue at level 0 from Grid (hash=43090134) using DependencyProperty(ActualWidth): '441.6' 
System.Windows.Data Warning: 78 : BindingExpression (hash=58235710): TransferValue - got raw value '441.6' 
System.Windows.Data Warning: 80 : BindingExpression (hash=58235710): TransferValue - user's converter produced '366.6' 
System.Windows.Data Warning: 87 : BindingExpression (hash=58235710): TransferValue - using final value '366.6' 
System.Windows.Data Warning: 94 : BindingExpression (hash=58235710): Got PropertyChanged event from Grid (hash=43090134) for ActualWidth 
System.Windows.Data Warning: 99 : BindingExpression (hash=58235710): GetValue at level 0 from Grid (hash=43090134) using DependencyProperty(ActualWidth): '453.6' 
System.Windows.Data Warning: 78 : BindingExpression (hash=58235710): TransferValue - got raw value '453.6' 
System.Windows.Data Warning: 80 : BindingExpression (hash=58235710): TransferValue - user's converter produced '378.6' 
System.Windows.Data Warning: 87 : BindingExpression (hash=58235710): TransferValue - using final value '378.6' 
System.Windows.Data Warning: 94 : BindingExpression (hash=58235710): Got PropertyChanged event from Grid (hash=43090134) for ActualWidth 
System.Windows.Data Warning: 99 : BindingExpression (hash=58235710): GetValue at level 0 from Grid (hash=43090134) using DependencyProperty(ActualWidth): '465.6' 
System.Windows.Data Warning: 78 : BindingExpression (hash=58235710): TransferValue - got raw value '465.6' 
System.Windows.Data Warning: 80 : BindingExpression (hash=58235710): TransferValue - user's converter produced '390.6' 
System.Windows.Data Warning: 87 : BindingExpression (hash=58235710): TransferValue - using final value '390.6' 
System.Windows.Data Warning: 94 : BindingExpression (hash=58235710): Got PropertyChanged event from Grid (hash=43090134) for ActualWidth 
System.Windows.Data Warning: 99 : BindingExpression (hash=58235710): GetValue at level 0 from Grid (hash=43090134) using DependencyProperty(ActualWidth): '477.6' 
System.Windows.Data Warning: 78 : BindingExpression (hash=58235710): TransferValue - got raw value '477.6' 
System.Windows.Data Warning: 80 : BindingExpression (hash=58235710): TransferValue - user's converter produced '402.6' 
System.Windows.Data Warning: 87 : BindingExpression (hash=58235710): TransferValue - using final value '402.6' 
System.Windows.Data Warning: 94 : BindingExpression (hash=58235710): Got PropertyChanged event from Grid (hash=43090134) for ActualWidth 
System.Windows.Data Warning: 99 : BindingExpression (hash=58235710): GetValue at level 0 from Grid (hash=43090134) using DependencyProperty(ActualWidth): '489.6' 
System.Windows.Data Warning: 78 : BindingExpression (hash=58235710): TransferValue - got raw value '489.6' 
System.Windows.Data Warning: 80 : BindingExpression (hash=58235710): TransferValue - user's converter produced '414.6' 
System.Windows.Data Warning: 87 : BindingExpression (hash=58235710): TransferValue - using final value '414.6' 
System.Windows.Data Warning: 94 : BindingExpression (hash=58235710): Got PropertyChanged event from Grid (hash=43090134) for ActualWidth 
System.Windows.Data Warning: 99 : BindingExpression (hash=58235710): GetValue at level 0 from Grid (hash=43090134) using DependencyProperty(ActualWidth): '501.6' 
System.Windows.Data Warning: 78 : BindingExpression (hash=58235710): TransferValue - got raw value '501.6' 
System.Windows.Data Warning: 80 : BindingExpression (hash=58235710): TransferValue - user's converter produced '426.6' 
System.Windows.Data Warning: 87 : BindingExpression (hash=58235710): TransferValue - using final value '426.6' 
System.Windows.Data Warning: 94 : BindingExpression (hash=58235710): Got PropertyChanged event from Grid (hash=43090134) for ActualWidth 
System.Windows.Data Warning: 99 : BindingExpression (hash=58235710): GetValue at level 0 from Grid (hash=43090134) using DependencyProperty(ActualWidth): '513.6' 
System.Windows.Data Warning: 78 : BindingExpression (hash=58235710): TransferValue - got raw value '513.6' 
System.Windows.Data Warning: 80 : BindingExpression (hash=58235710): TransferValue - user's converter produced '438.6' 
System.Windows.Data Warning: 87 : BindingExpression (hash=58235710): TransferValue - using final value '438.6' 
System.Windows.Data Warning: 94 : BindingExpression (hash=58235710): Got PropertyChanged event from Grid (hash=43090134) for ActualWidth 
System.Windows.Data Warning: 99 : BindingExpression (hash=58235710): GetValue at level 0 from Grid (hash=43090134) using DependencyProperty(ActualWidth): '525.6' 
System.Windows.Data Warning: 78 : BindingExpression (hash=58235710): TransferValue - got raw value '525.6' 
System.Windows.Data Warning: 80 : BindingExpression (hash=58235710): TransferValue - user's converter produced '450.6' 
System.Windows.Data Warning: 87 : BindingExpression (hash=58235710): TransferValue - using final value '450.6' 
System.Windows.Data Warning: 94 : BindingExpression (hash=58235710): Got PropertyChanged event from Grid (hash=43090134) for ActualWidth 
System.Windows.Data Warning: 99 : BindingExpression (hash=58235710): GetValue at level 0 from Grid (hash=43090134) using DependencyProperty(ActualWidth): '537.6' 
System.Windows.Data Warning: 78 : BindingExpression (hash=58235710): TransferValue - got raw value '537.6' 
System.Windows.Data Warning: 80 : BindingExpression (hash=58235710): TransferValue - user's converter produced '462.6' 
System.Windows.Data Warning: 87 : BindingExpression (hash=58235710): TransferValue - using final value '462.6' 
System.Windows.Data Warning: 94 : BindingExpression (hash=58235710): Got PropertyChanged event from Grid (hash=43090134) for ActualWidth 
System.Windows.Data Warning: 99 : BindingExpression (hash=58235710): GetValue at level 0 from Grid (hash=43090134) using DependencyProperty(ActualWidth): '549.6' 
System.Windows.Data Warning: 78 : BindingExpression (hash=58235710): TransferValue - got raw value '549.6' 
System.Windows.Data Warning: 80 : BindingExpression (hash=58235710): TransferValue - user's converter produced '474.6' 
System.Windows.Data Warning: 87 : BindingExpression (hash=58235710): TransferValue - using final value '474.6' 
System.Windows.Data Warning: 94 : BindingExpression (hash=58235710): Got PropertyChanged event from Grid (hash=43090134) for ActualWidth 
System.Windows.Data Warning: 99 : BindingExpression (hash=58235710): GetValue at level 0 from Grid (hash=43090134) using DependencyProperty(ActualWidth): '561.6' 
System.Windows.Data Warning: 78 : BindingExpression (hash=58235710): TransferValue - got raw value '561.6' 
System.Windows.Data Warning: 80 : BindingExpression (hash=58235710): TransferValue - user's converter produced '486.6' 
System.Windows.Data Warning: 87 : BindingExpression (hash=58235710): TransferValue - using final value '486.6' 

Все мысли на объясняет это поведение конвертера?

+0

Является ли сетка изменением размера с помощью изменения размера TextBlock? –

+0

@Wonko: Нет, но похоже, что это связано с взаимодействием с другим столбцом (Width = Auto в обоих столбцах), который запускается, когда я не оставляю достаточно ширины для второго столбца; установка уравнения на d-100D (оставляя больше места для другого столбца), кажется, исправляет проблему. Я все еще не знаю условия запуска, чтобы знать, что «достаточно» для другого столбца, почему он не просто обрезает другой столбец или делает другое окончательное определение. – Bill

ответ

1

По-видимому, сетке требуется больше места для текстового блока. Вы могли бы найти точку отсечки этого поведения при d-87D, так как сетке, по-видимому, потребуется дополнительно 12 пикселей при каждом изменении ширины текстового блока.

Кстати, может быть лучше использовать star sizing для столбца сетки, если все, что вы хотите, это дать относительный размер текстовому блоку.

+0

Спасибо Эрен. +1 за хорошие предложения. Я думаю, что ответ на мой вопрос заключается в том, что это ошибка. Я думаю, что ответ заключается в том, что я, должно быть, вызывал изменение размера сетки, не позволяя второй колонке достаточно места. Тем не менее, я думаю, что одна «автоматическая» настройка на размер сетки должна исправить макет, и макет должен решить стабильную настройку, а не привести к бесконечному циклу. Я думаю, что это, вероятно, ошибка. – Bill

+0

@Bill Это не ошибка. Обратите внимание, что «auto» означает «дайте мне размер, достаточный для соответствия моему содержимому». Он определяет размер, основанный на его содержимом, а не на доступном пространстве. Если окажется, что для его содержимого потребуется 100 px, это будет то же самое, что установка ширины в фиксированный размер 100 px. В вашем случае размер содержимого вторых столбцов не изменяется; поэтому столбец «auto» не изменяет его размер. –

+0

Непонятно, как ваше описание поведения авто связывается с поведением преобразователя, которое я описал. – Bill

0

Это, кажется, ошибка. Поведение разумно для одной «автоматической настройки» итерации, но не должно приводить к бесконечному циклу. См. Обсуждения выше.

В итоге я перешел на DockPanel, чтобы достичь желаемого расположения.

Смежные вопросы