【问题标题】:I want to change the line color using 'button trigger' in a specific condition我想在特定条件下使用“按钮触发器”更改线条颜色
【发布时间】:2019-10-06 10:56:33
【问题描述】:

我想改变 line1 和 line2 的颜色,如下所示。 如何在 C# 代码中绑定变量? 有没有很好的办法解决下面的代码?

  • xaml 代码
<ControlTemplate TargetType="ToggleButton">
    <Grid>
        <Grid Width="6" Height="6" HorizontalAlignment="Right" Margin="0,0,14,0">
            <Line x:Name="line1" X1="0" Y1="0" X2="6" Y2="6" Stroke="#BDC4CF" StrokeThickness="1"/>
            <Line x:Name="line2" X1="0" Y1="6" X2="6" Y2="0" Stroke="#BDC4CF" StrokeThickness="1"/>
        </Grid>
    </Grid>

    <ControlTemplate.Triggers>
        <Trigger Property="IsChecked" Value="True">
            <Setter TargetName="line1" Property="Stroke" Value="{binding linecolor}"/>
            <Setter TargetName="line2" Property="Stroke" Value="{binding linecolor}"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
  • c#代码
public bool IsChecked
{
    get { return (bool)GetValue(IsCheckedProperty); }
    set
    {
        SetValue(IsCheckedProperty, value);
        ToggleBtn.IsChecked = value;

        if(isPicked == true)
        {
            linecolor = (Brush)(new BrushConverter().ConvertFrom("#3EF79B"));
        }
        else
        {
            linecolor = (Brush)(new BrushConverter().ConvertFrom("#FFFFFF"));
        }
    }
}

【问题讨论】:

  • 你看过Converters了吗? IValueConverter usage
  • 我不需要复选框。我只想将颜色绑定到一个变量。
  • 你可以把你的价值变成一种颜色。 Here is a color example.
  • 您能否详细说明以下内容:IsCheckedPropertyisPickedlinecolor
  • 我已经给你留下了我将如何处理你的问题的答案。它解决了您的问题还是您的问题还有其他问题?请让我们知道,以便我们可以回答这个问题:)

标签: c# xaml


【解决方案1】:

我认为您需要在这里重新考虑您的方法。 首先是一些未知的东西。 我唯一会假设的是您的 isPicked 布尔值是一个属性。

我的做法是使用ValueConverter

所以首先在你的视图的DataContext 中,我将拥有IsPicked 属性:

private bool isPicked;
public bool IsPicked
{
    get { return isPicked; }
    set { isPicked = value; OnPropertyChanged(); }
}

然后我会为转换器创建一个新的 .cs 文件:

class BoolToColor : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool)value ? "#3EF79B" : "#FFFFFF";
        /*Same as:
        if((bool)value) 
        {
            return "#3EF79B";
        } 
        else 
        {
            return "#FFFFFF";
        }*/
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后最后在视图中进行设置(在这种情况下,我使用了Window):

<Window.Resources>
    <local:BoolToColor x:Key="BoolToColor" />
</Window.Resources>
<Grid>
    <Button Width="50" Height="50" Click="Button_Click" />
    <Grid Width="20" Height="20" HorizontalAlignment="Right" Margin="0,0,14,0">
        <Line x:Name="line1" X1="0" Y1="0" X2="20" Y2="20" Stroke="{Binding IsPicked, Converter={StaticResource BoolToColor}}" StrokeThickness="1"/>
        <Line x:Name="line2" X1="0" Y1="20" X2="20" Y2="0" Stroke="{Binding IsPicked, Converter={StaticResource BoolToColor}}" StrokeThickness="1"/>
    </Grid>
</Grid>

但是等待有一个按钮?是的,我添加了一个按钮来测试颜色变化。 这是Button_Click的代码:

private void Button_Click(object sender, RoutedEventArgs e)
{
    IsPicked = !IsPicked;
}

最后,我希望您明白,您可以更改IsPicked 的属性值来设置颜色,而不是按钮。我希望这能帮助你继续你的项目:)

【讨论】:

  • 感谢您的回答。感谢您,我解决了这个问题!实际上,我没有使用转换器。我刚刚访问了“line1”和“line2”并使用 IsChecked 更改了笔画,如下所示:line1.Stroke = (Brush)(new BrushConverter().ConvertFrom("#3EF79B"));
  • 很高兴听到您找到了答案。我使用转换器的原因主要是保持前端和后端分开。但在这种情况下似乎不需要它。快乐编码:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
相关资源
最近更新 更多