代码之家  ›  专栏  ›  技术社区  ›  Brett Ryan

如何在运行时更改元素样式?

  •  2
  • Brett Ryan  · 技术社区  · 15 年前

    我有一个元素和多个样式,如何在运行时以编程方式或通过XAML绑定在样式之间切换。

    <Rectangle x:Name="fixtureControl" Style="{DynamicResource FixtureStyle_Fast}">
    
    <!-- In the style resources. -->
    <Style x:Key="FixtureStyle_Fast" TargetType="{x:Type Shape}">
        <Setter Property="Stroke" Value="Black"/>
        <Setter Property="StrokeThickness" Value="20"/>
    </Style>
    
    <Style x:Key="FixtureStyle_Good" TargetType="{x:Type Shape}">
        <Setter Property="Effect">
            <Setter.Value>
                <DropShadowEffect Opacity=".9"
                                  Direction="-90"
                                  RenderingBias="Performance"
                                  BlurRadius="50"
                                  ShadowDepth="10" />
            </Setter.Value>
        </Setter>
    </Style>
    
    <Style x:Key="FixtureStyle_Best" TargetType="{x:Type Shape}">
        <Setter Property="Effect">
            <Setter.Value>
                <DropShadowEffect Opacity=".9"
                                  Direction="-90"
                                  RenderingBias="Quality"
                                  BlurRadius="50"
                                  ShadowDepth="10" />
            </Setter.Value>
        </Setter>
    </Style>
    

    然后我有一些单选按钮来处理样式的改变

    private void RadioButton_Click(object sender, RoutedEventArgs e) {
        if (e.Source == rdoQualityBest) {
            fixtureControl.Style = FindResource("FixtureStyle_Best") as Style;
        } else if (e.Source == rdoQualityGood) {
            fixtureControl.Style = FindResource("FixtureStyle_Good") as Style;
        } else {
            fixtureControl.Style = FindResource("FixtureStyle_Fast") as Style;
        }
    }
    

    2 回复  |  直到 13 年前
        1
  •  7
  •   Mark Carpenter    15 年前

    类似的东西在过去对我很有用(一个纯XAML解决方案):

    <!-- Styles 1-4 defined somewhere else on your page -->
    <ComboBox Name="AvailableStyles">
        <ComboBoxItem Tag="{x:Null}" IsSelected="True">None</ComboBoxItem>
        <ComboBoxItem Tag="{StaticResource Style1}">1</ComboBoxItem>
        <ComboBoxItem Tag="{StaticResource Style2}">2</ComboBoxItem>
        <ComboBoxItem Tag="{StaticResource Style3}">3</ComboBoxItem>
        <ComboBoxItem Tag="{StaticResource Style4}">4</ComboBoxItem>
    </ComboBox>
    
    <Button Content="Button" Style="{Binding ElementName=AvailableStyles, Path=SelectedItem.Tag}"/>
    <CheckBox Content="Check Box" Style="{Binding ElementName=AvailableStyles, Path=SelectedItem.Tag}"/>
    <RadioButton Content="Radio Button"Style="{Binding ElementName=AvailableStyles, Path=SelectedItem.Tag}"/>
    

    希望这有帮助!

        2
  •  4
  •   viky    15 年前

    这对我来说很好

    in.xaml

        <Window.Resources>
        <Style x:Key="FixtureStyle_Fast" TargetType="{x:Type Shape}">
            <Setter Property="Stroke" Value="Black"/>
            <Setter Property="StrokeThickness" Value="20"/>
        </Style>
    
        <Style x:Key="FixtureStyle_Good" TargetType="{x:Type Shape}">
            <Setter Property="Stroke" Value="Red"/>
            <Setter Property="StrokeThickness" Value="20"/>
        </Style>
    
        <Style x:Key="FixtureStyle_Best" TargetType="{x:Type Shape}">
            <Setter Property="Stroke" Value="Blue"/>
            <Setter Property="StrokeThickness" Value="20"/>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
         <Rectangle x:Name="fixtureControl" Style="{DynamicResource FixtureStyle_Fast}"/>
        <StackPanel Grid.Column="1">
        <RadioButton Name="rdoQualityBest" Content="Best" Click="RadioButton_Click" />
        <RadioButton Name="rdoQualityGood" Content="Good" Click="RadioButton_Click" />
        <RadioButton Name="rdoQualityFast" Content="Fast" Click="RadioButton_Click" />
        </StackPanel>
    </Grid>
    

    private void RadioButton_Click(object sender, RoutedEventArgs e)
    {
        if (e.Source == rdoQualityBest)
        {
            fixtureControl.Style = FindResource("FixtureStyle_Best") as Style;
        }
        else if (e.Source == rdoQualityGood)
        {
            fixtureControl.Style = FindResource("FixtureStyle_Good") as Style;
        }
        else
        {
            fixtureControl.Style = FindResource("FixtureStyle_Fast") as Style;
        }
    }