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