Шаблон стиля Binding - способ, который работает? - PullRequest
0 голосов
/ 05 января 2011

Я пытался (не удалось) создать шаблон кнопки для совместного использования библиотеками. Шаблон (в настоящее время) в основном представляет собой ограниченный круг внутри ограниченного круга. Чтобы сделать размер внутренней границы меньше внешнего, я использую конвертер на привязке. Я хотел бы передать свойство TemplatedParent в качестве ConverterParameter, но оно просто не работает, по-видимому, по замыслу. Бит не работает, потому что я пытаюсь привязать ConveterParameter к свойству TemplatedParent.

Вот мое определение стиля (в ResourceDictionary):

<SolidColorBrush x:Key="MyBorderFillColour">Yellow</SolidColorBrush>
<SolidColorBrush x:Key="MyBorderEdgeColour">#ff652f00</SolidColorBrush>
<SolidColorBrush x:Key="MyGeneralFillColour">#ffffffbd</SolidColorBrush>
<s:Int32 x:Key="MyBorderThickness">10</s:Int32>

<l:RelativeSizeConverter x:Key="RelativeSizeConverter" />

<Style x:Key="MyButtonStyle" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid>
                    <Ellipse 
                        Fill="{StaticResource MyBorderFillColour}" 
                        StrokeThickness="2" 
                        Stroke="{StaticResource MyBorderEdgeColour}" 
                        Height="{TemplateBinding Height}" 
                        Width="{TemplateBinding Width}" />
                    <Ellipse StrokeThickness="2" 
                        Stroke="{StaticResource MyBorderEdgeColour}" 
                        Fill="{StaticResource MyGeneralFillColour}"
                        Height="{Binding Path=Height,
                            RelativeSource={RelativeSource TemplatedParent}, 
                            Converter={StaticResource RelativeSizeConverter},
                            ConverterParameter={StaticResource MyBorderThickness}}"
                        Width="{Binding Path=Width,
                            RelativeSource={RelativeSource TemplatedParent}, 
                            Converter={StaticResource RelativeSizeConverter},
                            ConverterParameter={TemplateBinding BorderThickness}}" />
                    <TextBlock 
                        Text="{TemplateBinding Content}" 
                        HorizontalAlignment="Center" 
                        VerticalAlignment="Center" 
                        Foreground="Black" 
                        FontFamily="Calibri"
                        FontWeight="Bold"
                        FontSize="17" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Высота второго эллипса работает с использованием StaticResource, но ширина не работает с использованием подхода TemplateBinding. Я также попробовал

ConverterParameter={Binding Path=BorderThickness,RelativeSource={RelativeSource TemplatedParent}}

Есть идеи, как достичь своей цели?!?

Спасибо за любую помощь,

Ответы [ 2 ]

0 голосов
/ 05 января 2011

Вам не нужно делать что-то настолько причудливое здесь; система компоновки будет обрабатывать его для вас (используя свойство Margin и поведение растяжения эллипса в контейнере):

    <Grid Height="{TemplateBinding Height}" Width="{TemplateBinding Width}">
        <Ellipse 
                    Fill="{StaticResource MyBorderFillColour}" 
                    StrokeThickness="2" 
                    Stroke="{StaticResource MyBorderEdgeColour}"/> 
        <Ellipse StrokeThickness="2" Margin="4"
                    Stroke="{StaticResource MyBorderEdgeColour}" 
                    Fill="{StaticResource MyGeneralFillColour}"/>
        <TextBlock 
                    Text="{TemplateBinding Content}" 
                    HorizontalAlignment="Center" 
                    VerticalAlignment="Center" 
                    Foreground="Black" 
                    FontFamily="Calibri"
                    FontWeight="Bold"
                    FontSize="17" />
    </Grid>

Обратите внимание, что для большей гибкости вы должны использовать ContentPresenter вместо ContentBlock; это в настоящее время не выполняет контракт Button, если пользователь шаблонной кнопки предоставляет более сложный Контент.

0 голосов
/ 05 января 2011

Это не работает, потому что для предоставления выражения привязки для значения оно должно быть свойством зависимости. ConverterParameter не является свойством зависимости, поэтому вы не можете связать его значение.

Как насчет использования немного менее общего подхода, когда вы создаете несколько более специфических преобразователей значений. Затем вы можете использовать «точечный» путь, так что ваша кнопка будет передана в качестве значения конвертеру, затем вы сможете напрямую получить доступ к ширине, ширине границы и т. Д.

  Width="{Binding Path=.,
                        RelativeSource={RelativeSource TemplatedParent}, 
                        Converter={StaticResource RelativeWidthWidthBorderSizeConverter}}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...