Задать значение для значения свойства в родительском стиле WPF - PullRequest
0 голосов
/ 11 марта 2019

У меня есть следующий WPF Style для пользовательского элемента управления

<Style TargetType="{x:Type local:TransportControl}">
    <Setter Property="MinorTickBrush" Value="{DynamicResource BlackBrush}"/>
    <Setter Property="MajorTickBrush" Value="{DynamicResource BlackBrush}"/>
    <Setter Property="IndicatorBrush" Value="{DynamicResource BlckBrush}"/>
    <Setter Property="ProgressBorderBrush" Value="{DynamicResource BlackBrush}"/>
    <Setter Property="ProgressBrush" Value="{DynamicResource HighlightBrush}"/>
    <Setter Property="IndicatorSize" Value="16"/>
    <Setter Property="IndicatorBrush" Value="{DynamicResource BlackBrush}"/>
    <Setter Property="IndicatorGlow" Value="True"/>
    <Setter Property="IndicatorGlowBrush" Value="GhostWhite"/>
    <Setter Property="FontFamily" Value="Segoe UI"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:TransportControl}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Padding="{Binding Path=DataContext.IndicatorSize, 
                            RelativeSource={RelativeSource AncestorType={x:Type local:TransportControl}}, 
                            Converter={StaticResource ValueToHorizontalPaddingConverter}}"
                        Margin="4,2">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="20"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Canvas Name="PART_TimelineCanvas" Grid.Row="0" Height="20" ClipToBounds="False"/>
                        <Canvas Name="PART_ProgressCanvas" Grid.Row="1" ClipToBounds="False"/>
                        <Canvas Name="PART_IndicatorCanvas" 
                                  Grid.Row="0" 
                                  Grid.RowSpan="2" 
                                  ClipToBounds="False" 
                                  Panel.ZIndex="2"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

с IValueConverter как

public class ValueToHorizontalPaddingConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object format, CultureInfo culture)
    {
        double padding = System.Convert.ToDouble(value);
        return new Thickness(padding, 0, padding, 0);
    }

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

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

Padding="{Binding Path=DataContext.IndicatorSize, 
    RelativeSource={RelativeSource AncestorType={x:Type local:TransportControl}}, 
    Converter={StaticResource ValueToHorizontalPaddingConverter}}" 

Что я делаю не так?

Спасибо за ваше время.

1 Ответ

1 голос
/ 11 марта 2019

Вы можете использовать TemplateBinding, чтобы сделать это:

Padding="{TemplateBinding IndicatorSize, Converter={StaticResource ValueToHorizontalPaddingConverter}}"

Другим способом центрирования индикатора будет присвоение границе имени, получение ссылки на него в методе OnApplyTemplate (..) вашего пользовательского элемента управления и установка его Padding в C # при каждом изменении свойства IndicatorSize. Таким образом, вам не нужно связывание и конвертер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...