Как изменить шаблон Silverlight во время выполнения? - PullRequest
2 голосов
/ 01 октября 2009

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

Я думал, что мог бы использовать GetTemplateChild, чтобы получить ссылку на сетку в шаблоне из метода OnApplyTemplate элемента управления, но этот метод не запускается.

public override void OnApplyTemplate()
{
  base.OnApplyTemplate();

  _tooltipDetails = (Grid)GetTemplateChild("TooltipDetailsGrid");
}

Как еще я мог бы сделать это?

Вот XAML пользовательского элемента управления.

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Class="MiX.AssetManagement.UI.Timeline.Silverlight.TimelineBarRibbonItem"
    FontSize="9.333" Foreground="White" mc:Ignorable="d">
    <UserControl.Resources>
        <ControlTemplate x:Key="ToolTipControlTemplateTimelineView" TargetType="ToolTip">
            <StackPanel Orientation="Horizontal" Margin="16,0,0,0">
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="OpenStates">
                        <VisualState x:Name="Closed"/>
                        <VisualState x:Name="Open"/>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                <Border CornerRadius="4">
                    <Border.Background>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="#7F000000" Offset="0"/>
                            <GradientStop Color="#B2000000" Offset="1"/>
                        </LinearGradientBrush>
                    </Border.Background>
                    <Grid Margin="4">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <Border x:Name="Info" Height="16" Width="16" BorderThickness="2" CornerRadius="8" HorizontalAlignment="Left" VerticalAlignment="Top">
                            <Border.BorderBrush>
                                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                    <GradientStop Color="White" Offset="0"/>
                                    <GradientStop Color="#7FFFFFFF" Offset="1"/>
                                </LinearGradientBrush>
                            </Border.BorderBrush>
                            <Path Fill="White" Stretch="Fill" Margin="5.229,2.089,5.035,2.82" RenderTransformOrigin="0.5,0.5" UseLayoutRounding="False" Data="M0.77471197,5.0623446 L2.4198356,5.0623446 L2.4198356,10.18 L0.77471197,10.18 z M0.72914064,3.0891075 L2.4654069,3.0891075 L2.4654069,4.3332038 L0.72914064,4.3332038 z">
                                <Path.RenderTransform>
                                    <TransformGroup>
                                        <ScaleTransform/>
                                        <SkewTransform/>
                                        <RotateTransform/>
                                        <TranslateTransform/>
                                    </TransformGroup>
                                </Path.RenderTransform>
                            </Path>
                        </Border>
                        <ContentPresenter d:LayoutOverrides="Width, Height" Margin="20,0,0,0"/>
                        <Grid Grid.Column="1" x:Name="TooltipDetailsGrid">
                            <TextBlock Text="Tooltip in a Grid"/>
                        </Grid>
                    </Grid>
                </Border>
            </StackPanel>
        </ControlTemplate>
    </UserControl.Resources>

    <Path x:Name="RibbonItem" Cursor="Hand">
        <Path.Fill>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FF66CC33"/>
                <GradientStop Color="#FF339900" Offset="1"/>
            </LinearGradientBrush>
        </Path.Fill>
        <ToolTipService.ToolTip>
            <ToolTip x:Name="RibbonItemTooltip" Content="" Foreground="#FFFFFFFF" FontSize="9.333" Placement="Mouse" Template="{StaticResource ToolTipControlTemplateTimelineView}"/>
        </ToolTipService.ToolTip>
        <Path.Data>
            <GeometryGroup x:Name="RibbonItemGeometryGroup">
                <RectangleGeometry x:Name="RibbonItemBackground" />
            </GeometryGroup>
        </Path.Data>
    </Path>
</UserControl>

Ответы [ 2 ]

1 голос
/ 01 октября 2009

Вы должны обрабатывать код в методе ToolTip Classes OnApplyTemplate. Вот мой непроверенный удар о том, что вам нужно сделать: -

Наследование от ToolTip и переопределение метода OnApplyTemplate в этом новом классе: -

 public MyToolTip : ToolTip
 {
     public override void OnApplyTemplate()
     {
         //Perhaps to stuff
         base.OnApplyTemplate();
         //Perhaps to other stuff
     }
 }

В ваших ресурсах вы теперь установите TargetType на local:MyToolTip и убедитесь, что ваше пространство имен сборки размещено с псевдонимом local в элементе управления пользователя.

Теперь в вашем Xaml: -

    <ToolTipService.ToolTip>
            <local:MyToolTip x:Name="RibbonItemTooltip" Content="" Foreground="#FFFFFFFF" FontSize="9.333" Placement="Mouse" Template="{StaticResource ToolTipControlTemplateTimelineView}"/>
    </ToolTipService.ToolTip>
0 голосов
/ 01 октября 2009

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

Вероятно, это лучший подход, поскольку структура подсказок теперь четко видна в XAML, а не скрыта в коде.

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