none
如何控制ControlTemplate子元素 RRS feed

  • 问题

  • 【我这回确定了这是发在中文论坛上的。。】

    我准备设计一个ListboxItem的模版(ControlTemplate),包括下面内容:

    ControlTemplate

    其中我为Image添加了鼠标进入和退出的两个个Storyboard来更改透明度,但是实际上并不在主窗体我实际应用此模版的ListboxItem产生效果。

    我知道可以使用实际的ListboxItem触发这个Storyboard,但是以后我还会在模版里添加其他图标的,必须得是鼠标移动到哪个图标,哪个图标的对应Storyboard开始(Begin),并且我希望图标点击后能产生一个事件来方便我添加代码处理。也就是要控制这个ControlTemplate的子元素。请问该如何实现?

    2012年8月28日 14:20

答案

全部回复

  • 我不清楚你的StoryBoard是如何定义的,下面是一个简单的示例,在示例中,Image控件将在鼠标移入和移出事件中执行动画。

            <Style TargetType="ListBoxItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Border BorderBrush="Black" BorderThickness="1" Margin="20 20 20 10">
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition />
                                        <RowDefinition />
                                    </Grid.RowDefinitions>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition />
                                        <ColumnDefinition Width="Auto" />
                                    </Grid.ColumnDefinitions>
                                    <Label Name="name" Grid.Row="0" Grid.Column="0" Content="{Binding Name}" Margin="10 10 5 5" />
                                    <Image Name="avatar" Grid.Row="0" Grid.Column="1" Source="{Binding Avatar}" Margin="5 10 10 5" Width="96" Height="96" Opacity="0.8" />
                                    <Label Name="address" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Content="{Binding Address}" Margin="10 5 10 10" />
                                </Grid>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger SourceName="avatar" Property="IsMouseOver" Value="True">
                                    <Trigger.EnterActions>
                                        <BeginStoryboard>
                                            <Storyboard>
                                                <DoubleAnimation Storyboard.TargetName="avatar" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:1" />
                                            </Storyboard>
                                        </BeginStoryboard>
                                    </Trigger.EnterActions>
                                    <Trigger.ExitActions>
                                        <BeginStoryboard>
                                            <Storyboard>
                                                <DoubleAnimation Storyboard.TargetName="avatar" Storyboard.TargetProperty="Opacity" To="0.8" Duration="0:0:1" />
                                            </Storyboard>
                                        </BeginStoryboard>
                                    </Trigger.ExitActions>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>


    Wanpeng wanpeng.ones@gmail.com

    2012年8月29日 3:05
  • 昨天手欠把那个模版删了。今天重做了一个。定义在App.xaml中:

    	<Application.Resources>
    		<ControlTemplate x:Key="ListItem" TargetType="{x:Type ListBoxItem}">
    			
    			<Grid x:Name="grid" Height="Auto" Margin="0">
    				<Label x:Name="MainLabel" Content="Label" HorizontalAlignment="Left" Width="124" Height="24" VerticalAlignment="Top"/>
    				<Label x:Name="SecondaryLabel" Content="Label" Height="23.5" Margin="8,24.5,0,0" VerticalAlignment="Top" Width="Auto" d:LayoutOverrides="HorizontalAlignment"/>
    			</Grid>
    		</ControlTemplate>
    	</Application.Resources>

    暂时没做Image控件。我主要想在主窗体中点击某个按钮后添加一个应用此模版的ListBoxItem,但是我需要更改其MainLabel和SecondaryLabel的Content,当然是用C#代码。应该如何实现?

    【今天倒是看到了一个调用其Storyboard的方法:http://social.msdn.microsoft.com/Forums/zh-TW/wpf/thread/534d87a9-d8c6-4b34-8891-b06c2e235023

    2012年8月29日 6:43
  • 为什么不是定义整个ListBoxItem的样式,然后操作绑定数据?

    你个业务就仅变成了向ObservableCollection<Item>中添加一个Item。


    Wanpeng wanpeng.ones@gmail.com


    • 已编辑 Wanpeng 2012年8月29日 6:58
    2012年8月29日 6:48
  • 我改主意了,直接就改成多行Content就可以了

    2012年8月29日 11:48