将用户选择的颜色显示为矩形和字符串WPF C#

将用户选择的颜色显示为矩形和字符串WPF C#,c#,.net,wpf,C#,.net,Wpf,我正在编写一个WPF应用程序,用户可以从windows窗体颜色对话框中选择一种颜色,并在列表框中显示所选颜色。所选颜色将显示为一个列表框项目,其中包含一个矩形(即所选颜色)和一个所选颜色名称字符串。但是,我无法显示矩形和颜色名称。当我运行程序时,只要将矩形添加到列表框中,它就会显示矩形。但是,当我添加颜色名称时,它会将矩形显示为字符串 C# WPF E 我没有使用代码隐藏,而是创建了一个新创建的类的集合ColorData,通过使用它,我们将能够充分利用项目模板 步骤1:-ColorData类创

我正在编写一个WPF应用程序,用户可以从windows窗体颜色对话框中选择一种颜色,并在列表框中显示所选颜色。所选颜色将显示为一个列表框项目,其中包含一个矩形(即所选颜色)和一个所选颜色名称字符串。但是,我无法显示矩形和颜色名称。当我运行程序时,只要将矩形添加到列表框中,它就会显示矩形。但是,当我添加颜色名称时,它会将矩形显示为字符串

C#

WPF


E

我没有使用代码隐藏,而是创建了一个新创建的类的集合
ColorData
,通过使用它,我们将能够充分利用项目模板

步骤1:-
ColorData
类创建

public class ColorData
{
    public ColorData(Brush color, String colorName)
    {
        ColorBrush = color;
        ColorText = colorName;
    }
    public Brush ColorBrush { get; set; }
    public string ColorText { get; set; }
} 
步骤2:-创建一个可观察的
ColorData类集合,并在构造函数内部启动它,为了支持绑定,我给出了this.DataContext=this

public ObservableCollection<ColorData> ColorCollection { get; set; }

public MainWindow()
{
    ColorCollection = new ObservableCollection<ColorData>();
    InitializeComponent();
    this.DataContext = this;
}
步骤4:-更改XAML(仅更改绑定中的
PropertyName
) 命名您的窗口/用户控件。以支持ElementBinding。在这种情况下,我使用了
Window1

使用ColorBrush&ColorText和 然后绑定属性。
ItemsSource=“{Binding ElementName=Window1,Path=DataContext.ColorCollection}

<ListBox x:Name="lstControl" ItemsSource="{Binding ElementName=Window1,Path=DataContext.ColorCollection}"
             Width="300" Height="85" Margin="10 10 20 4">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Margin="0,3,0,0">
                        <StackPanel.Resources>
                            <Style TargetType="TextBlock">
                                <Setter Property="Margin" Value="5,0,0,0"/>
                            </Style>
                        </StackPanel.Resources>
                        <Rectangle Width="30" Fill="{Binding ColorBrush}"/>
                        <TextBlock Width="130" Text="{Binding ColorText}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

由您决定,您将实现哪种方法,但我建议您选择第一种方法(绑定)。

@DavidJacoby让我知道它是否适合您
public ObservableCollection<ColorData> ColorCollection { get; set; }

public MainWindow()
{
    ColorCollection = new ObservableCollection<ColorData>();
    InitializeComponent();
    this.DataContext = this;
}
private void addNewItem_Click(object sender, RoutedEventArgs e)
{
    ColorDialog cd = new ColorDialog();
    if (cd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        var itemsCount = lstControl.Items.Count;
        var colorName = cd.Color;
        //Create rectangle object
        System.Windows.Shapes.Rectangle myRect = new System.Windows.Shapes.Rectangle();
        myRect.Fill = new SolidColorBrush(System.Windows.Media.Color.FromArgb(colorName.A, colorName.R, colorName.G, colorName.B));

        ColorCollection.Add(new ColorData(new SolidColorBrush(System.Windows.Media.Color.FromArgb(colorName.A, colorName.R, colorName.G, colorName.B)), colorName.Name ));
    }
}
<ListBox x:Name="lstControl" ItemsSource="{Binding ElementName=Window1,Path=DataContext.ColorCollection}"
             Width="300" Height="85" Margin="10 10 20 4">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Margin="0,3,0,0">
                        <StackPanel.Resources>
                            <Style TargetType="TextBlock">
                                <Setter Property="Margin" Value="5,0,0,0"/>
                            </Style>
                        </StackPanel.Resources>
                        <Rectangle Width="30" Fill="{Binding ColorBrush}"/>
                        <TextBlock Width="130" Text="{Binding ColorText}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
 private void addNewItem_Click(object sender, RoutedEventArgs e)
        {
            ColorDialog cd = new ColorDialog();
            if (cd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                var itemsCount = lstControl.Items.Count;
                var colorName = cd.Color;
                //Create rectangle object
                System.Windows.Shapes.Rectangle myRect = new System.Windows.Shapes.Rectangle();
                myRect.Fill = new SolidColorBrush(System.Windows.Media.Color.FromArgb(colorName.A, colorName.R, colorName.G, colorName.B));

                myRect.Height = 10;
                myRect.Width = 50;

                TextBlock label = new TextBlock();
                label.Height = 10;
                label.Width = 50;

                Grid layout = new Grid();
                layout.Children.Add(myRect);
                layout.Children.Add(label);
                label.Text = colorName.Name;
                var newItem = new ListBoxItem
                {
                    Content = layout
                };

                lstControl.Items.Add(newItem);
            }
        }