【问题标题】:WPF sliders to change button colors on clickWPF 滑块可在单击时更改按钮颜色
【发布时间】:2020-10-03 05:44:10
【问题描述】:

我正在做一个项目,我必须根据 WPF 中的滑块更改按钮颜色。这是我的 XAML 设计。

XAML file

所以,我制作了 64 个按钮,并且尝试实现多个选项,但没有一个对我有用。

我有这个 xaml 代码:

<Grid Grid.Column="0" Grid.RowSpan="4" Grid.ColumnSpan="4" HorizontalAlignment="Left" Height="790" Margin="0,10,0,0" Grid.Row="0" VerticalAlignment="Top" Width="800">
            <Grid Margin="230,114,230,346" AutomationProperties.Name="ledMatrix" Tag="ledMatrix" >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>

<Button Grid.Column="0" Grid.Row="0" Height="40" Width="40" Command="{Binding LEDBtn}" Background="#FFAAAAAA" Tag="LED00" Click="changeLedIndicatiorColor" x:Name="LEDButton"/>
                <Button Grid.Column="1" Grid.Row="0" Height="40" Width="40" Command="{Binding LEDBtn}" Background="#FFAAAAAA" Tag="LED01"/>
                <Button Grid.Column="2" Grid.Row="0" Height="40" Width="40" Command="{Binding LEDBtn}" Background="#FFAAAAAA" Tag="LED02"/>
                <Button Grid.Column="3" Grid.Row="0" Height="40" Width="40" Command="{Binding LEDBtn}" Background="#FFAAAAAA" Tag="LED03"/>
                <Button Grid.Column="4" Grid.Row="0" Height="40" Width="40" Command="{Binding LEDBtn}" Background="#FFAAAAAA" Tag="LED04"/>
                <Button Grid.Column="5" Grid.Row="0" Height="40" Width="40" Command="{Binding LEDBtn}" Background="#FFAAAAAA" Tag="LED05"/>
                <Button Grid.Column="6" Grid.Row="0" Height="40" Width="40" Command="{Binding LEDBtn}" Background="#FFAAAAAA" Tag="LED06"/>
                <Button Grid.Column="7" Grid.Row="0" Height="40" Width="40" Command="{Binding LEDBtn}" Background="#FFAAAAAA" Tag="LED07"/>

和滑块:

<Grid Margin="230,480,230,170">
                <Slider x:Name="SeekR" Margin="0,0,0,120" Tag="seekR" Maximum="255" Background="Red" ></Slider>
                <Slider x:Name="SeekG" Margin="0,50,0,70" Tag="seekG" Maximum="255" Background="Green"></Slider>
                <Slider x:Name="SeekB" Margin="0,100,0,20" Tag="seekB" Maximum="255" Background="Blue"></Slider>
            </Grid>

我已经尝试将它放在我的 xaml.cs 文件中:

public void changeColor()
        {
            byte rr = (byte)SeekR.Value;
            byte gg = (byte)SeekG.Value;
            byte bb = (byte)SeekB.Value;
            Color cc = Color.FromRgb(rr, gg, bb); //Create object of Color class.
            SolidColorBrush colorBrush = new SolidColorBrush(cc); //Creating object of SolidColorBruch class.
            LEDButton.Background = colorBrush; //Setting background of stack panel.
        }
        private void changeLedIndicatiorColor(object sender, RoutedEventArgs e)
        {
            changeColor();
        }

但是从这段代码中,我必须以不同的方式命名所有按钮,但我希​​望所有按钮具有相同的绑定并尝试将它们连接在一起,因此例如我想通过滑块设置颜色,当我单击按钮颜色会改变。然后,我可以更改颜色,并制作不同颜色的其他按钮。

【问题讨论】:

  • 为什么需要对每个按钮进行不同的命名?将所有按钮挂钩到同一个 Click 事件并使用事件中的 sender,因为这是引发事件的按钮的实例。
  • 好吧,是的,我已经试过了,但是LEDButton.Background = colorBrush; 这一行将为x:Name:"LEDButton" 的一个按钮设置背景颜色。我想知道我可以用什么来代替它,所以所有按钮都包括在内。

标签: c# wpf visual-studio xaml data-binding


【解决方案1】:

重构ChangeColor 以接受Button,更改颜色的按钮:

private void ChangeLedIndicatiorColor_OnClick(object sender, RoutedEventArgs e)
{
  ChangeColor(sender as Button);
}

public void ChangeColor(Button button)
{
  byte rr = (byte)SeekR.Value;
  byte gg = (byte)SeekG.Value;
  byte bb = (byte)SeekB.Value;
  Color cc = Color.FromRgb(rr, gg, bb); 
  SolidColorBrush colorBrush = new SolidColorBrush(cc); 

  button.Background = colorBrush;
}

然后为每个Button.Click注册ChangeLedIndicatiorColor事件处理程序:

...

<Button Click="ChangeLedIndicatiorColor" />
<Button Click="ChangeLedIndicatiorColor" />
<Button Click="ChangeLedIndicatiorColor" />
...

【讨论】:

  • 非常感谢,我没想到。效果很好。
【解决方案2】:

您可以使用 EventSetter 使事件适用于所有按钮。您不再需要将 click 事件处理程序附加到每个按钮。

    <Window.Resources>
        <Style TargetType="Button">
            <EventSetter Event="Click" Handler="ChangeLedIndicatiorColor"/>
        </Style>
    </Window.Resources>

在事件处理程序中,您可以更改触发点击事件的按钮的颜色。

private void changeLedIndicatiorColor(object sender, RoutedEventArgs e)
{
    byte rr = (byte)SeekR.Value;
    byte gg = (byte)SeekG.Value;
    byte bb = (byte)SeekB.Value;
    Color cc = Color.FromRgb(rr, gg, bb); 
    SolidColorBrush colorBrush = new SolidColorBrush(cc); 
    (sender as Button).Background = colorBrush; 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2019-01-03
    • 2012-12-06
    • 2016-09-08
    • 1970-01-01
    相关资源
    最近更新 更多