查找组合框项内矩形的填充值
Posted
技术标签:
【中文标题】查找组合框项内矩形的填充值【英文标题】:Find the Fill value of a rectangle inside a comboboxItem 【发布时间】:2014-09-23 10:10:01 【问题描述】:我有以下 xaml 代码:
<Window x:Class="WPF_les_3.Oefening_4"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Oefening_4" Height="300" Width="300">
<StackPanel Width="auto" Margin="20px">
<ComboBox Width="100" SelectionChanged="ComboBox_Selected" x:Name="comboBox">
<ComboBoxItem>
<StackPanel Orientation="Horizontal">
<Rectangle Fill="Red" Height="20" Width="20"/>
<TextBlock Text=" Red"/>
</StackPanel>
</ComboBoxItem>
<ComboBoxItem>
<StackPanel Orientation="Horizontal">
<Rectangle Fill="Yellow" Height="20" Width="20"/>
<TextBlock Text=" Yellow"/>
</StackPanel>
</ComboBoxItem>
<ComboBoxItem>
<StackPanel Orientation="Horizontal">
<Rectangle Fill="Green" Height="20" Width="20"/>
<TextBlock Text=" Green"/>
</StackPanel>
</ComboBoxItem>
</ComboBox>
</StackPanel>
如您所见,在我的 ComboboxItems 中有一个矩形和一个文本块。现在我想在处理我的 selectionchanged 事件时检索矩形的填充颜色(或文本块的文本,它是相同的),所以我可以根据所选颜色更改窗口的背景(这是目标练习)。
【问题讨论】:
不,还没有,但如果我能这样解决,那就没关系了。 将您的ComboBox.ItemsSource
绑定到List<System.Windows.Media.Color>
并使用它的SelectedItem
属性来找出选择的颜色。
【参考方案1】:
详细说明我上面的评论,这是在 WPF 中实现所需功能的正确方法:
首先,创建一个适当的 ViewModel,其中包含可用颜色列表和 SelectedColor 属性:
public class ColorsViewModel
public ObservableCollection<string> Colors get; private set;
private string _selectedColor;
public string SelectedColor
get return _selectedColor;
set
_selectedColor = value;
MessageBox.Show("Selected Color: " + value); //message box here to show the code is actually working.
//... More code here in a moment
然后,确保使用相关数据填充颜色集合。特别是在颜色的情况下,WPF 有内置的 TypeConverters 可以从(例如)string
隐式转换为System.Windows.Media.Color
,因此我们可以利用它来简化我们的代码并使用简单的字符串:
//Continuation of the above code
public ColorsViewModel()
Colors = new ObservableCollection<string>
"Red",
"Green",
"Blue",
"Yellow",
;
最后使用正确的DataBinding 在 XAML 中创建 UI:
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<ComboBox ItemsSource="Binding Colors"
SelectedItem="Binding SelectedColor"
VerticalAlignment="Center" HorizontalAlignment="Center">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Rectangle Fill="Binding" Height="20" Width="20"/>
<TextBlock Text="Binding"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Window>
结果:
【讨论】:
非常感谢!那个对我来说很清楚,再加上JPone的解决方案,我有两个办法。【参考方案2】:更改事件被触发并且 ComboBox.SelectedItem 具有您需要的信息。 您必须像我的以下方法一样分析 SelectedItem:
private void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
ComboBoxItem comboBoxItem = this.comboBox.SelectedItem as ComboBoxItem;
if (comboBoxItem != null)
StackPanel stackPanel = comboBoxItem.Content as StackPanel;
if(stackPanel != null && stackPanel.Children[0] is Rectangle)
var fill = (stackPanel.Children[0] as Rectangle).Fill;
在这里,您可以获得矩形的填充,并且可以处理此问题或做您的事情。 但请耐心等待,此代码完全是为您的示例创建的(ComboBoxItem 和 Content StackPanel,Children[0] 为 Rectangle)。更改将中断流程;)
【讨论】:
-1。这违背了 WPF 中所有已知的、公认的、推荐的良好实践和模式。在可视化树中最细微的变化时,您的代码很容易被完全破坏。如果我在 XAML 中将StackPanel
更改为 Grid
会怎样?
我评论说此代码示例完全适用于给定示例。如果选择其他解决方案,我更喜欢自己的 DataTemplate 和包含“颜色、名称”的 DataObject,并通过 Collection 将其绑定到 ComboBox。 ComboBox 的 SelectedItem 应该绑定到视图模型中,所有更改都可以从那里处理。以上是关于查找组合框项内矩形的填充值的主要内容,如果未能解决你的问题,请参考以下文章