【问题标题】:Silverlight Change Style property from referencing objectSilverlight 从引用对象更改样式属性
【发布时间】:2011-08-29 13:42:57
【问题描述】:

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

我的风格如下

 <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>

我需要能够设置text1text2Text 属性

【问题讨论】:

  • 这个问题需要更多细节,显示包含提到的 TextBlock 的 xaml。

标签: .net silverlight


【解决方案1】:

这是我会采取的方法。

创建一个名为“DualTextToggleButton”的新“Silverlight Templated Control”并将基类从“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 设置器的添加。您的模板可能会在适当的情况下更多地使用TemplateBinding,目前大多数设置器完全没有做任何事情,因为 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}">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 2012-04-25
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多