ToggleButton按下时更改背景(但只有一次)

时间:2012-05-10 13:22:19

标签: c# wpf styles

按下按钮时,按钮的背景(Rectangle Fill)会发生变化。因此,用户可以看到按下了哪些按钮,哪些按钮没有按下。

问题:

我使用触发器和Togglebutton执行"IsChecked"来更改背景。 但背景变化可能只发生过一次。

例如:

按钮背景=黑色 - > PRESS - >按钮背景=蓝色

但是当我再次按下按钮时,Button BackGround会变回黑色(因为它是一个ToggleButton)。

如何确保背景只更改一次?

编辑:该按钮必须保持启用状态,因为用户在按下按钮时会给出原因。这意味着如果他们选择了错误的原因,他们就可以改变它。

<Style x:Key="ButtonStyleReg" TargetType="{x:Type myClasses:RegButton}">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type ToggleButton}">
            <Grid x:Name="registrationButton">
                <Rectangle Name="rectangleBtn" Fill="#FF89959A" Height="Auto" RadiusY="15" RadiusX="15" Stroke="White" Width="Auto"/>

                <TextBlock x:Name="reason" TextWrapping="Wrap" 
                           Text="{Binding Reason, StringFormat=\{0\}}"
                           HorizontalAlignment="Center" Margin="0,7.5,0,0" Height="Auto" 
                           VerticalAlignment="Top" FontWeight="Bold" >
                </TextBlock>                                                                                   
            </Grid>
            <ControlTemplate.Triggers>
                <Trigger Property="IsFocused" Value="True"/>
                <!--<Trigger Property="IsDefaulted" Value="True"/>-->

                <Trigger Property="IsChecked" Value="True">
                    <Setter TargetName="rectangleBtn" Property="Fill" Value="blue" />
                </Trigger>                                                     
                <Trigger Property="IsEnabled" Value="False"/>
            </ControlTemplate.Triggers>
        </ControlTemplate>

    </Setter.Value>
</Setter>
<Setter Property="FontSize" Value="10.667"/>

实现样式的列表框:

<ListBox x:Name="lbRegistration" ItemsSource="{Binding RegBtns, ElementName=Window}" Background="{x:Null}" 
            BorderBrush="{x:Null}" Grid.Column="1" 
            ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Disabled" Height="75">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <myClasses:RegistrationButton x:Name="RegistrationButton" HorizontalAlignment="Center" Height="71" Width="148" 
                                                  Margin="10,0,5,0" 
                                                  Style="{DynamicResource ButtonStyleRegistration}"
                                                  Click="RegistrationButton_Click"
                                                  Title="{Binding Title}"
                                                  Oorzaak="{Binding Oorzaak}"     

                                                  DuurStilstand="{Binding DuurStilstand, 
                                                        Converter={StaticResource  DateTimeConverter}}"

                                                  BeginStilstand="{Binding BeginStilstand}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

最诚挚的问候, 皮特

2 个答案:

答案 0 :(得分:1)

如果您可以从后面的代码访问矩形,那将非常简单:

rectangleBtn.Fill = Brushes.Blue;

如果你无法访问它 - 让自己两种风格。 原始样式的那个,另一个是Blue Style,当用户点击时应该应用。

在后面的代码中,关于事件Click =“RegistrationButton_Click” 将样式设置为BlueStyle。

RegistrationButton.Style = this.FindResource("ButtonStyleRegistration") as Style;

因为你总是想要它是蓝色的,所以这段代码就足够了。它总会让它成为蓝色。 第一次和任何其他时间。 这样你就可以达到你的要求,风格只会改变一次。 加载窗口时,它将加载到原始样式(第一个样式)。 所以在你的XAML中加入“Black”风格和后面的代码,如上所示。

然后必须将其删除:

<Trigger Property="IsChecked" Value="True"> 
    <Setter TargetName="rectangleBtn" Property="Fill" Value="blue" /> 
</Trigger>    

然后这个:

<myClasses:RegistrationButton x:Name="RegistrationButton" HorizontalAlignment="Center" Height="71" Width="148"  
Margin="10,0,5,0"  
Style="{DynamicResource ButtonStyleRegistration}" 
Click="RegistrationButton_Click"

应该:

<myClasses:RegistrationButton x:Name="RegistrationButton" HorizontalAlignment="Center" Height="71" Width="148"  
Margin="10,0,5,0"  
Style="{DynamicResource ButtonStyleRegBlack}" 
Click="RegistrationButton_Click"

就是这样。

答案 1 :(得分:1)

如果您使用的是MVVM方法,我建议将后台和Click命令绑定到ViewModel中的成员。第一次单击该按钮时,它会设置一个标志并更改背景颜色。下次单击该按钮时,如果设置了该标志,则该命令将返回而不更改背景。

XAML:

<ToggleButton Background="{Binding MyBackground}" Command="{Binding OnClickCmd}"/> 

视图模型

public class ViewModel : INotifyPropertyChanged
{
     public Brush MyBackground 
     { 
          get { return background_; } 
          set {
                background_ = value;
                PropertyChanged(this, new PropertyChangedEventArg("MyBackground");
          }
     }

     public ICommand OnClickCmd
     {
          get {
               return new DelegateCommand(()=>{ // DelegateCommand implements ICommand
                  if(!isBackgroundSet) {
                      background = Brushes.Red;
                      isBackgroundSet_ = true;    
                  }
               });
          }
     }

     private Brush background_;
     private bool isBackgroundSet_;
     private event PropertyChangedEventHandler PropertyChagned;
 }