查找组合框项内矩形的填充值

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&lt;System.Windows.Media.Color&gt; 并使用它的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 应该绑定到视图模型中,所有更改都可以从那里处理。

以上是关于查找组合框项内矩形的填充值的主要内容,如果未能解决你的问题,请参考以下文章

ExtJS 动态更改组合框项的值

将列表框项内的命令绑定到视图模型父级上的属性

VBA 中的动态组合框项

易语言 之动态添加组合框项

如果选择了某些组合框项,则使文本块可见-MVVM

从后面的代码中添加组合框项。 [WPF]