Silverlight的RadioButton样式--记录

本文介绍了一种WPF RadioButton的自定义样式实现方法,通过详细展示样式代码,帮助读者了解如何调整RadioButton的各种视觉效果,包括不同状态下的外观变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方便日后项目中提取样式代码,记录在此博客中


样式代码如下:

<Style x:Key="RadioButtonStyle1" TargetType="RadioButton">
 <Setter Property="Background" Value="#FF448DCA"/>
 <Setter Property="Foreground" Value="#FF556676"/>
 <Setter Property="HorizontalContentAlignment" Value="Left"/>
 <Setter Property="VerticalContentAlignment" Value="Top"/>
 <Setter Property="Padding" Value="4,1,0,0"/>
 <Setter Property="BorderThickness" Value="1"/>
 <Setter Property="BorderBrush" Value="#41a3ef" />
 <Setter Property="Template">
  <Setter.Value>
   <ControlTemplate TargetType="RadioButton">
    <Grid>
     <Grid.ColumnDefinitions>
      <ColumnDefinition Width="16"/>
      <ColumnDefinition Width="*"/>
     </Grid.ColumnDefinitions>
     <VisualStateManager.VisualStateGroups>
      <VisualStateGroup x:Name="CommonStates">
       <VisualState x:Name="Normal"/>
       <VisualState x:Name="MouseOver">
        <Storyboard>
         <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="BackgroundOverlay"/>
        <!-- <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="BoxMiddleBackground"/> -->
        </Storyboard>
       </VisualState>
       <VisualState x:Name="Pressed">
        <Storyboard>
         <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="BackgroundOverlay"/>
        <!-- <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="BoxMiddleBackground"/> -->
        </Storyboard>
       </VisualState>
       <VisualState x:Name="Disabled">
        <Storyboard>
         <DoubleAnimation Duration="0" To=".55" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="contentPresenter"/>
         <DoubleAnimation Duration="0" To="0.55" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="DisabledVisualElement"/>
        </Storyboard>
       </VisualState>
      </VisualStateGroup>
      <VisualStateGroup x:Name="CheckStates">
       <VisualState x:Name="Checked">
        <Storyboard>
        <!-- <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="CheckIcon"/> -->
         <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="BoxMiddle" />
        </Storyboard>
       </VisualState>
       <VisualState x:Name="Unchecked"/>
      </VisualStateGroup>
      <VisualStateGroup x:Name="FocusStates">
       <VisualState x:Name="Focused">
        <Storyboard>
         <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ContentFocusVisualElement"/>
        </Storyboard>
       </VisualState>
       <VisualState x:Name="Unfocused"/>
      </VisualStateGroup>
      <VisualStateGroup x:Name="ValidationStates">
       <VisualState x:Name="Valid"/>
       <VisualState x:Name="InvalidUnfocused">
        <Storyboard>
         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement">
          <DiscreteObjectKeyFrame KeyTime="0">
           <DiscreteObjectKeyFrame.Value>
            <Visibility>Visible</Visibility>
           </DiscreteObjectKeyFrame.Value>
          </DiscreteObjectKeyFrame>
         </ObjectAnimationUsingKeyFrames>
        </Storyboard>
       </VisualState>
       <VisualState x:Name="InvalidFocused">
        <Storyboard>
         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement">
          <DiscreteObjectKeyFrame KeyTime="0">
           <DiscreteObjectKeyFrame.Value>
            <Visibility>Visible</Visibility>
           </DiscreteObjectKeyFrame.Value>
          </DiscreteObjectKeyFrame>
         </ObjectAnimationUsingKeyFrames>
         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" Storyboard.TargetName="validationTooltip">
          <DiscreteObjectKeyFrame KeyTime="0">
           <DiscreteObjectKeyFrame.Value>
            <System:Boolean>True</System:Boolean>
           </DiscreteObjectKeyFrame.Value>
          </DiscreteObjectKeyFrame>
         </ObjectAnimationUsingKeyFrames>
        </Storyboard>
       </VisualState>
      </VisualStateGroup>
     </VisualStateManager.VisualStateGroups>
     <Grid HorizontalAlignment="Left" VerticalAlignment="Top">
      <Ellipse x:Name="BackgroundOverlay" Fill="#dff1ff" Height="14" Margin="1" Opacity="0" Stroke="Transparent" StrokeThickness="0" Width="14"/>
      <Ellipse x:Name="Background" Fill="Transparent" Height="14" Margin="1" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="{TemplateBinding BorderThickness}" Width="14"/>        
     <!-- <Ellipse x:Name="BoxMiddleBackground" Fill="Transparent" Height="10" Stroke="Transparent" StrokeThickness="0" Width="10"/> -->
      <Ellipse x:Name="BoxMiddle" Opacity="0" Height="6" StrokeThickness="0" Width="6" Fill="#41a3ef" Stroke="Transparent" />
      
     <!-- <Ellipse x:Name="BoxMiddleLine" Height="10" Opacity="0" Stroke="Transparent" StrokeThickness="0" Width="10"/> -->
     <!-- <Ellipse x:Name="CheckIcon" Fill="#FF333333" Height="4" Opacity="0" Width="4"/> -->
      <Ellipse x:Name="DisabledVisualElement" Fill="#FFFFFFFF" Height="14" Opacity="0" Width="14"/>
      <Ellipse x:Name="ContentFocusVisualElement" Height="16" IsHitTestVisible="false" Opacity="0" Stroke="#FF6DBDD1" StrokeThickness="1" Width="16"/>
      <Grid x:Name="ValidationErrorElement" ToolTipService.PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Visibility="Collapsed">
       <ToolTipService.ToolTip>
        <ToolTip x:Name="validationTooltip" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" Placement="Right" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Template="{StaticResource ValidationToolTipTemplate}">
         <ToolTip.Triggers>
          <EventTrigger RoutedEvent="Canvas.Loaded">
           <BeginStoryboard>
            <Storyboard>
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsHitTestVisible" Storyboard.TargetName="validationTooltip">
              <DiscreteObjectKeyFrame KeyTime="0">
               <DiscreteObjectKeyFrame.Value>
                <System:Boolean>true</System:Boolean>
               </DiscreteObjectKeyFrame.Value>
              </DiscreteObjectKeyFrame>
             </ObjectAnimationUsingKeyFrames>
            </Storyboard>
           </BeginStoryboard>
          </EventTrigger>
         </ToolTip.Triggers>
        </ToolTip>
       </ToolTipService.ToolTip>
       <Ellipse Height="14" Stroke="#FFDB000C" StrokeThickness="1" Width="14"/>
       <Ellipse Fill="#FFDB000C" HorizontalAlignment="Right" Height="4" Margin="0,-2,-1,0" VerticalAlignment="Top" Width="4"/>
       <Ellipse Fill="Transparent" HorizontalAlignment="Right" Height="10" Margin="0,-5,-4,0" VerticalAlignment="Top" Width="10"/>
      </Grid>
     </Grid>
     <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Grid.Column="1" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
    </Grid>
   </ControlTemplate>
  </Setter.Value>
 </Setter>
</Style>


/****************************************************************** Function : onRadioClickMatrix Date : 2016-05-03 10:53:09 Author : Parameter : Return : Desc : 选择启用/禁用模式 2016.2.26 ******************************************************************/ void MatrixTask::onRadioClickMatrix() { if (sender() == ui->matrixAll_radioButton) // 全矩阵 { if (ui->matrixAll_radioButton->isChecked()) { ui->matrixSingle_radioButton->setChecked(false); ui->matrixRow_radioButton->setChecked(false); ui->matrixColumn_radioButton->setChecked(false); ui->matrixChange_radioButton->setChecked(false); m_matrixID = MATRIX_ALL; } else { m_matrixID = -1; } } else if (sender() == ui->matrixSingle_radioButton) // 单点 { if (ui->matrixSingle_radioButton->isChecked()) { ui->matrixAll_radioButton->setChecked(false); ui->matrixRow_radioButton->setChecked(false); ui->matrixColumn_radioButton->setChecked(false); ui->matrixChange_radioButton->setChecked(false); m_matrixID = MATRIX_SINGLE; } else { m_matrixID = -1; } } else if (sender() == ui->matrixRow_radioButton) // 整行 { if (ui->matrixRow_radioButton->isChecked()) { ui->matrixSingle_radioButton->setChecked(false); ui->matrixAll_radioButton->setChecked(false); ui->matrixColumn_radioButton->setChecked(false); ui->matrixChange_radioButton->setChecked(false); m_matrixID = MATRIX_ROW; } else { m_matrixID = -1; } } else if (sender() == ui->matrixColumn_radioButton) // 整列 { if (ui->matrixColumn_radioButton->isChecked()) { ui->matrixSingle_radioButton->setChecked(false); ui->matrixRow_radioButton->setChecked(false); ui->matrixAll_radioButton->setChecked(false); ui->matrixChange_radioButton->setChecked(false); m_matrixID = MATRIX_CLUMN; } else { m_matrixID = -1; } } else if (sender() == ui->matrixChange_radioButton) // 取反 { if (ui->matrixChange_radioButton->isChecked()) { ui->matrixSingle_radioButton->setChecked(false); ui->matrixRow_radioButton->setChecked(false); ui->matrixAll_radioButton->setChecked(false); ui->matrixColumn_radioButton->setChecked(false); m_matrixID = MATRIX_CHANGE; } else { m_matrixID = -1; } } ui->widget_2->setMouseOpstatus(MatrixImageWidget::MOS_SELECT_POS); }
最新发布
03-15
<think>好的,我现在需要分析用户提供的这段C++代码,并按照他们的要求用中文进行解释。首先,我得仔细阅读代码,理解每个部分的功能。用户可能希望了解这个函数的作用、结构以及实现逻辑。 首先看函数名onRadioClickMatrix,这通常是一个槽函数,用于处理单选按钮的点击事件。代码中使用sender()来获取发送信号的控件,然后根据不同的单选按钮执行相应操作。每个条件分支对应不同的单选按钮,当某个按钮被选中时,取消其他按钮的选中状态,并设置m_matrixID为对应的枚举值。 接下来要注意用户的要求:结构清晰,分步解释,确保正确性。需要解释函数的目的、逻辑结构、互斥单选按钮的处理、m_matrixID的作用,以及最后一行设置鼠标状态的部分。同时需要检查代码中的潜在问题,比如MATRIX_CLUMN可能是拼写错误,正确应为MATRIX_COLUMN。这一点需要指出,以帮助用户改进代码。 另外,要使用中文回答,并且行内数学表达式用$...$,但在这个代码分析中可能用不上数学公式。不过要确保符合格式要求。可能需要提到枚举值或其他常量时使用代码格式,但用户没有特别要求,所以保持自然的中文解释即可。 现在组织回答的结构:先概述函数作用,然后分解代码逻辑,解释每个条件分支,讨论变量和枚举的作用,指出可能的拼写错误,最后总结函数流程。这样用户能逐步理解代码的每个部分,同时注意到潜在的问题。 需要确认代码中的每个步骤是否正确。例如,当单选按钮被选中时,取消其他按钮的选中状态,这确保了单选效果。设置m_matrixID为对应模式,之后设置鼠标状态为选择位置。这部分逻辑是正确的,但拼写错误需要注意。 总结时,确保覆盖所有关键点,并指出改进建议,这样用户不仅理解代码还能进行优化。</think>这个`onRadioClickMatrix`函数是一个典型的Qt单选按钮组互斥选择处理函数,主要用于矩阵操作模式的切换。以下是逐步分析: #### 一、函数作用 通过单选按钮控制矩阵操作模式,包括: - 全矩阵模式(`MATRIX_ALL`) - 单点模式(`MATRIX_SINGLE`) - 整行模式(`MATRIX_ROW`) - 整列模式(`MATRIX_CLUMN`,疑似拼写错误应为`MATRIX_COLUMN`) - 取反模式(`MATRIX_CHANGE`) #### 二、代码逻辑解析 1. **信号发送者检测** 通过`sender() == ui->xxx_radioButton`判断事件来源,这是Qt标准的事件处理方式。例如: ```cpp if (sender() == ui->matrixAll_radioButton) // 检测是否来自"全矩阵"单选按钮 ``` 2. **互斥控制逻辑** 当某个单选按钮被选中时(`isChecked()`为真),显式取消其他单选按钮的选中状态: ```cpp ui->matrixSingle_radioButton->setChecked(false); // 取消单点模式选中 ui->matrixRow_radioButton->setChecked(false); // 取消整行模式选中 // ...其他类似操作 ``` 3. **模式标识设置** 根据选中状态更新`m_matrixID`枚举值: ```cpp m_matrixID = MATRIX_ALL; // 激活全矩阵模式 // 或 m_matrixID = -1; // 无效状态(当取消选中时) ``` 4. **鼠标状态设置** 最后统一设置鼠标操作状态为位置选择模式: ```cpp ui->widget_2->setMouseOpstatus(MatrixImageWidget::MOS_SELECT_POS); ``` #### 三、潜在问题 1. **拼写问题** `MATRIX_CLUMN`应为`MATRIX_COLUMN`(列模式),这是常见的拼写错误。 2. **状态管理冗余** 每个条件分支中重复编写相同的取消选中代码,可通过循环或容器优化: ```cpp QList<QRadioButton*> buttons = {ui->matrixAll_radioButton, ui->matrixSingle_radioButton, ...}; foreach(QRadioButton* btn, buttons) { if(btn != currentButton) btn->setChecked(false); } ``` #### 四、执行流程总结 ```mermaid graph TD A[点击单选按钮] --> B{判断发送者} B --> |全矩阵| C[取消其他按钮选中] B --> |单点| D[取消其他按钮选中] B --> |整行| E[取消其他按钮选中] B --> |整列| F[取消其他按钮选中] B --> |取反| G[取消其他按钮选中] C --> H[设置m_matrixID] D --> H E --> H F --> H G --> H H --> I[设置鼠标选择状态] ``` 建议在维护时增加注释说明每个模式的具体行为,并修复拼写错误以保证代码可读性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值