Получить ширину столбца, если он установлен на "2 *" для Binding в xaml WPF? - PullRequest
0 голосов
/ 20 марта 2019

У меня есть StackPanel в третьем столбце сетки "MainGrid".Его ширина (третий столбец) установлена ​​на «2 *».

Я хочу скрыть StackPanel, используя поле, а затем использовать анимацию слайдов, чтобы показать его.

Поэтому мне нужно установить Margin из StackPanel в столбец [2] Ширина , но как мне его получить?Я пытаюсь это:

Margin="{Binding ElementName=MainGrid, Path=ColumnDefinitions[2].ActualWidth, Converter={StaticResource marginConverter}}

Итак, я добавляю точку останова к конвертеру в коде позади, и он всегда получает 0.

Я пытался использовать MainGrid .ActualWidth установлен в столбец [2] ActualWidth и отправляет конвертеру сначала ноль , затем фактическая ширина .

1 Ответ

0 голосов
/ 21 марта 2019

К сожалению, ColumnDefinition.ActualWidth не является свойством зависимости, то есть оно не будет сообщать об обновлении. Быстрое решение - написать новый класс, унаследованный от ColumnDefinition, и уведомление ActualWidth изменяется каждый раз, когда родительский Grid обновил свой макет. И вместо ColumnDefinition используйте этот класс в xaml.

public class MyColumnDefinition : ColumnDefinition, INotifyPropertyChanged
{
    public MyColumnDefinition() : base() { }

    protected override void OnInitialized(EventArgs e)
    {
        base.OnInitialized(e);

        ((Grid)Parent).LayoutUpdated += MyColumnDefinition_LayoutUpdated;
    }

    private void MyColumnDefinition_LayoutUpdated(object sender, EventArgs e)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ActualWidth"));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}
...