Как связать значение непрозрачности на основе непрозрачности объекта из другого ControlTemplate? - PullRequest
1 голос
/ 16 декабря 2010

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

Image x:Name="PART_IconHover" Source="{Binding IconHover}" Opacity="{Binding Opacity, ElementName=border, Mode=OneWay}" />

Ниже приведен код двух шаблонов ControlTemplates:

<Setter Property="Template">
<Setter.Value>
    <ControlTemplate TargetType="{x:Type Button}">
        <Border x:Name="border" BorderBrush="#FF6E6E6E" BorderThickness="0.5" Opacity="0" Background="#00000000">
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="CommonStates">
                    <VisualState x:Name="Normal"/>
                    <VisualState x:Name="MouseOver">
                        <Storyboard>
                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="border">
                                <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                            </DoubleAnimationUsingKeyFrames>
                                                                </Storyboard>
                    </VisualState>
                    <VisualState x:Name="Pressed"/>
                    <VisualState x:Name="Disabled"/>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsKeyboardFocused" Value="true"/>
            <Trigger Property="ToggleButton.IsChecked" Value="true"/>
            <Trigger Property="IsEnabled" Value="false">
                <Setter Property="Foreground" Value="#ADADAD"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Setter.Value>

Я хочу привязать непрозрачность к изображению в шаблоне ControlTemplate ниже

<ControlTemplate x:Key="ThumbnailContainerTemplate" TargetType="{x:Type ContentControl}">
    <Border x:Name="PART_Border" BorderThickness="1" BorderBrush="#FFd9d9d9" Opacity="0" />
    <Grid Margin="10">   
            <Image x:Name="PART_IconHover" Source="{Binding IconHover}" Opacity="{Binding Opacity, ElementName=border, Mode=OneWay}" />
    </Grid>

Любые идеи высоко ценятся. Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 16 декабря 2010

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

Если вам просто нужно числовое значение где-то в вашем xaml, которое вы хотите, чтобы все использовали, вы можете просто добавить одно из следующих:

<sys:Double x:Key="Opacity">.5</sys:Double>

Тогда просто связывай все с этим. Вам нужно будет добавить пространство имен sys

xmlns:sys="clr-namespace:System;assembly=mscorlib"
1 голос
/ 17 декабря 2010

Как сказал mdm20, вы не можете связывать элементы внутри шаблонов извне шаблона, так как шаблон просто используется для создания элемента управления. Например, несколько кнопок могут использовать шаблон в вашем примере, так с какой кнопкой будет связан ContentControl?

Я не вижу решения для многократного использования, но одна вещь, которая приходит в голову, это установить привязку в коде после завершения загрузки элементов управления, как это

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    Border border = myButton.Template.FindName("border", myButton) as Border;
    Image PART_IconHover = contentControl.Template.FindName("PART_IconHover", contentControl) as Image;

    Binding opacityBinding = new Binding("Opacity");
    opacityBinding.Mode = BindingMode.OneWay;
    opacityBinding.Source = border;
    PART_IconHover.SetBinding(Image.OpacityProperty, opacityBinding);
}

Обновление
Два элемента управления привязываются к границе в шаблоне кнопки. Привязка выполняется в обработчике событий Control_Loaded.

<ContentControl ...
                Loaded="Control_Loaded">
    <ContentControl.Style>
        <Style TargetType="ContentControl">
            <Setter Property="Template" Value="{StaticResource contentTemplate}"/>
        </Style>
    </ContentControl.Style>
</ContentControl>
<ContentControl ...
                Loaded="Control_Loaded">
    <ContentControl.Style>
        <Style TargetType="ContentControl">
            <Setter Property="Template" Value="{StaticResource contentTemplate}"/>
        </Style>
    </ContentControl.Style>
</ContentControl>

private void Control_Loaded(object sender, RoutedEventArgs e)
{
    Border border = myButton.Template.FindName("border", myButton) as Border;
    Control control = sender as Control;
    Image PART_IconHover = control.Template.FindName("PART_IconHover", control) as Image;

    Binding opacityBinding = new Binding("Opacity");
    opacityBinding.Mode = BindingMode.OneWay;
    opacityBinding.Source = border;
    PART_IconHover.SetBinding(Image.OpacityProperty, opacityBinding);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...