引用对象的Silverlight Change Style属性

时间:2011-08-29 13:42:58

标签: .net silverlight

我有一个<Style x:Key="ToggleButtonStyle" TargetType="ToggleButton">,其中有一个TextBlock。我希望ToggleButton能够在引用样式时更改Text的{​​{1}}属性。我怎么能这样做?

我的风格如下

TextBlock

我需要能够设置 <Style x:Key="ReturnToggleButton" TargetType="ToggleButton"> <Setter Property="BorderThickness" Value="1"/> <Setter Property="BorderBrush" Value="#FF999999"/> <Setter Property="Background" Value="#FFECECEB"/> <Setter Property="Foreground" Value="#FF999999"/> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="Padding" Value="3"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ToggleButton"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center" Background="Transparent"> <VisualStateManager.VisualStateGroups> ... </VisualStateManager.VisualStateGroups> <TextBlock x:Name="text1" TextWrapping="Wrap" Text="Open" Foreground="#FF35393D" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="10" FontFamily="Verdana"/> <Border x:Name="border1" BorderBrush="#FF999999" BorderThickness="1" CornerRadius="1" Height="14" Width="36" Margin="6,0" Background="Transparent"> <TextBlock x:Name="text2 TextWrapping="Wrap" Text="9:30" Foreground="#FF999999" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="10" FontFamily="Verdana"/> </StackPanel> </ControlTemplate> </Setter.Value> </Setter> </Style> Text的{​​{1}}属性

1 个答案:

答案 0 :(得分:0)

这是我采取的方法。

创建一个名为“DualTextToggleButton”的新“Silverlight模板化控件”,并将基类从“Control”更改为“ToggleButton”。

添加两个名为“Text1”和“Text2”的DependencyProperties(您可能希望使用比我在这里选择更好的名称)。现在打开Themes / Generic.xaml文件,并将DualTextToggleButton的默认样式替换为您当前使用的样式。像这样: -

 <Style TargetType="local:DualTextToggleButton">
    <Setter Property="Text1" Value="Open" />
    <Setter Property="Text2" Value="9:30" />
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="BorderBrush" Value="#FF999999"/>
    <Setter Property="Background" Value="#FFECECEB"/>
    <Setter Property="Foreground" Value="#FF999999"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Padding" Value="3"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToggleButton">
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center" Background="Transparent">
                    <VisualStateManager.VisualStateGroups>
                     ...   
                    </VisualStateManager.VisualStateGroups>
                    <TextBlock x:Name="text1" TextWrapping="Wrap" Text="{TemplateBinding Text1}" Foreground="#FF35393D" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="10" FontFamily="Verdana"/>
                    <Border x:Name="border1" BorderBrush="#FF999999" BorderThickness="1" CornerRadius="1" Height="14" Width="36" Margin="6,0" Background="Transparent">
                                    <TextBlock x:Name="text2 TextWrapping="Wrap" Text="{TemplateBinding Text2}" Foreground="#FF999999" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="10" FontFamily="Verdana"/>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

请注意TemplateBinding的使用以及Text1和Text2 setter的添加。您的模板可能会在适当的情况下使用更多TemplateBinding用法,目前大多数setter都没有执行任何操作,因为ControlTemplate会忽略它们。

现在您可以在Xaml中创建此控件的实例,如下所示: -

 <local:DualTextToggleButton Text1="Closed" Text2="17:00" />

或者您通过Style: -

执行此操作
 <Style x:Key="SomeDualTextToggleButtonStyle">
    <Setter Property="Text1" Value="Closed" />
    <Setter Property="Text2" Value="17:00" />
 </Style>

或者您可以使用DataBinding: -

 <ListBox ItemsSource="{Binding ListOfModelItems}">
     <ListBox.ItemStyle>
        <DataTemplate>
            <local:DualTextToggleButton Text1="{Binding State}" Text2="{Binding TimeOfDay}"
                IsChecked="{Binding Enabled, Mode=TwoWay}" />
        </DataTemplate>  
     </ListBox.ItemStyle>
 </ListBox ItemsSource="{Binding ListOfModelItems}">