如何获取文本框的前景色和背景色以便在拾色器中进一步使用?

How to get foreground and background colors of textbox for further usage in Color Picker?

前景和背景属性为画笔类型。如何获取颜色以在拾色器中进一步使用?

我将前景和背景传递给属性 window 的 c-tor,如下所示:

private void Menu_Properties_OnClick(object sender, RoutedEventArgs e)
{
    PropertiesDialog propDialog = new PropertiesDialog(TbTimer.Foreground, TimerPanel.Background);
    if (propDialog.ShowDialog() == true)
    {
        //set color to TbTimer textbox and TimerPanel WrapPanel
    }
}

TbTimer是TextBox,TimerPanel是WrapPanel。

这是属性 window c-tor:

public PropertiesDialog(Brush foreground, Brush background)
{
    InitializeComponent();

    FontColorPicker.SelectedColor = foreground; //Compilation error
    BgColorPicker.SelectedColor = background; //Compilation error
}

这里我得到 Cannot implicitly convert type 'System.Windows.Media.Brush' to 'System.Windows.Media.Color'.

如何获取笔刷颜色?

简单地改变你的方法签名:

public PropertiesDialog(System.Windows.Media.Color foreground, System.Windows.Media.Color background)
{
    InitializeComponent();

    FontColorPicker.SelectedColor = foreground; 
    BgColorPicker.SelectedColor = background; 
}

SelectedColour 需要 System.Windows.Media.Color 类型,但是您正在尝试分配画笔...尝试按如下方式进行转换。

public PropertiesDialog(Brush foreground, Brush background)
{
    InitializeComponent();

    FontColorPicker.SelectedColor = ((SolidColorBrush)foreground).Color;
    BgColorPicker.SelectedColor = ((SolidColorBrush)background).Color; 
}

当您将 XAML 中元素的 Background 属性 设置为 "Red" 之类的内容时,类型转换器会将字符串 "Red" 转换为SolidColorBrush 对象,其 Color 属性 设置为适当的颜色。

所以这个:

<TextBlock Background="Red" />

相当于:

<TextBlock>
    <TextBlock.Background>
        <SolidColorBrush Color="Red" />
    </TextBlock.Background>
</TextBlock>

SolidColorBrush 是唯一具有单个 "colour" 的笔刷类型。其他画笔类型可能有不止一种颜色,或者可能根本不代表 "colour"(例如 DrawingBrushVisualBrush)。

如果您希望对话框的构造函数将 Brush 个对象作为参数,但又想将它们作为单色处理,那么您需要按照@BenjaminPaul 的方法将它们转换为 SolidColorBrush 个对象回答。当然,画笔的类型实际上可能不同,因此显式转换会失败并出现异常。

你能做的最好的事情是这样的:

public PropertiesDialog(Brush foreground, Brush background)
{
    InitializeComponent();

    var solidForeground = foreground as SolidColorBrush;
    var solidBackground = background as SolidColorBrush;

    if (solidForeground == null || solidBackground == null)
    {
        // One or both of the brushes does not have a
        // single solid colour; what you do here is up to you
        throw new InvalidOperationException();
    }

    FontColorPicker.SelectedColor = solidForeground.Color;
    BgColorPicker.SelectedColor = solidBackground.Color;
}