5

我有一个用户控件,它使用如下的画笔资源为控件中的几个元素提供颜色:

        <UserControl.Resources>
            <SolidColorBrush x:Key="BlackBrush" Color="Black"/>
        </UserControl.Resources>

现在,我想使用触发器更改此资源的颜色,以便在发生特定条件时提供突出显示。

这可能吗?如果是这样,怎么做?

谢谢!

4

3 回答 3

3

我认为您不能从 xaml 中的触发器更改资源颜色。

您可以在代码隐藏中更改颜色,或者将 SolidColorBrush 中的颜色设置为对象的数据绑定属性。

SolidColorBrush myBrush = (SolidColorBrush)this.TryFindResource("BlackBrush");

if (myBrush != null)
{
    myBrush.Color = Colors.Yellow;
}

否则,您需要根据触发器交换画笔。下面是一个例子:

   <Grid Margin="50">
      <Grid.Resources>
         <SolidColorBrush x:Key="BlackBrush" Color="Black"/>
         <SolidColorBrush x:Key="WhiteBrush" Color="White"/>

         <Style x:Key="test" TargetType="TextBlock">

           <Setter Property="Background" Value="{StaticResource BlackBrush}"/>

            <Style.Triggers>
               <Trigger Property="Text" Value="white">
                  <Setter Property="Background" Value="{StaticResource WhiteBrush}"/>
               </Trigger>
               <Trigger Property="Text" Value="black">
                  <Setter Property="Background" Value="{StaticResource BlackBrush}"/>
               </Trigger>
            </Style.Triggers>
         </Style>

      </Grid.Resources>
      <TextBlock
         Height="20"
         Margin="50"
         Padding="50"
         Style="{StaticResource test}"
         Text="white">
      </TextBlock>
   </Grid>

这将根据文本值更改背景颜色;如果文本为白色,则背景为白色,黑色,则背景为黑色。

于 2012-10-05T22:30:17.660 回答
2

不,您不能这样做 XAML,但问题是您想根据其他控件/控件的状态更改某些控件。

您至少有以下选择(看看这个线程):

  • 如果元素可以在一个内容模板中,您可以使用触发器并为 setter 提供 SourceName 和 TargetName 以指向目标元素
  • 您也可以在元素上使用 EventTriggers,它看起来像这样:

    <StackPanel>
    <Label Margin="10" x:Name="lbl">My Label</Label>
    <Button Width="150" Height="100" Background="Yellow" x:Name="btn1">My Button
    </Button>
    <StackPanel.Triggers>
        <EventTrigger RoutedEvent="Button.MouseMove" SourceName="btn1">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="lbl" Storyboard.TargetProperty="(Label.Background)">
                            <DiscreteObjectKeyFrame KeyTime="0:0:0">
                                <DiscreteObjectKeyFrame.Value>
                                    <SolidColorBrush Color="Yellow"/>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
        <EventTrigger RoutedEvent="Button.MouseLeave" SourceName="btn1">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="lbl" Storyboard.TargetProperty="(Label.Background)">
                            <DiscreteObjectKeyFrame KeyTime="0:0:0">
                                <DiscreteObjectKeyFrame.Value>
                                    <SolidColorBrush Color="White"/>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </StackPanel.Triggers>
    

于 2012-10-05T22:44:03.460 回答
2

您可以创建画笔并将其“Color”属性绑定到隐藏控件的“Foreground.Color”属性。然后可以在任何地方使用此画笔,并在执行触发器时更改其颜色:

<Grid Background="Black">
    <Grid.Resources>
      <SolidColorBrush x:Key="BrushForeground" Color="{Binding ElementName=collapsedControl, Path=Foreground.Color}" />
      <SolidColorBrush x:Key="BrushGreen" Color="Lime" />
      <SolidColorBrush x:Key="BrushRed" Color="Red" />
    </Grid.Resources>
    <Control Name="collapsedControl" Visibility="Collapsed">
      <Control.Style>
        <Style TargetType="Control">
          <Setter Property="Foreground" Value="{StaticResource BrushGreen}" />
          <Style.Triggers>
            <DataTrigger Binding="{Binding IsIncorrect}" Value="True">
              <Setter Property="Foreground" Value="{StaticResource BrushRed}" />
            </DataTrigger>
          </Style.Triggers>
        </Style>
      </Control.Style>
    </Control>
    <Label Content="Sample Text" Foreground="{StaticResource BrushForeground}" />
    <Button Width="150"
            Height="50"
            Click="Button_Click"
            Content="Set IsIncorrect to true" />
  </Grid>
于 2020-11-11T11:11:51.093 回答