【ArcGIS Pro二次开发】(84):WPF_给Combobox加点料

一、要实现的功能

在WPF中,一个正常的Combobox是长这样的:

当点击下拉框的时候,下拉列表就是简单的文本,看起来很单一。

这里我们给它加点料,让它变成这样:

就是给文本前面加个图标,这个图标可以根据item的属性更改,比如要素图层和独立表就可以用不同的图标来表示,让人一目了然。


二、实现方法

首先,正常的ComboBox代码长这样:

<ComboBox x:Name="combox_fc" 
    Margin="15,35,15,0" 
    VerticalAlignment="Top" 
    DropDownOpened="combox_fc_DropDown"/>

要更改下拉框的内容,需要修改【ItemTemplate】下的【DataTemplate】:

        <ComboBox x:Name="combox_fc" Margin="15,35,15,0" VerticalAlignment="Top" DropDownOpened="combox_fc_DropDown">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Source="/CCTool;component/Data/Icons/layer.png" Width="16" Height="16"/>
                        <TextBlock Margin="5,0" Text="文本"/>
                    </StackPanel>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>

【DataTemplate】下加入了一个Image用来放图标,TextBlock用来代替原来的Text。

但是这里的Image和TextBlock都被写死的,正常使用的时候,ComboBox的item是需要实时变化的。

最好的解决方法是将Image的Source值,以及TextBlock的Text值进行绑定,从而实现实时更新。

代码修改如下:

        <ComboBox x:Name="combox_fc" Margin="15,35,15,0" VerticalAlignment="Top" DropDownOpened="combox_fc_DropDown">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Source="{Binding Path}" Width="16" Height="16"/>
                        <TextBlock Margin="5,0" Text="{Binding Name}"/>
                    </StackPanel>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>

回到后端,首先定义一个类,用来储存上述两个绑定的属性:

    // 图层
    public class FeatureLayerContent
    {
        public string Path { get; set; }
        public string Name { get; set; }
    }

例子里,ComboBox要获取的是当前地图中的所有要素图层和独立表:

// 获取当前地图
Map map = MapView.Active.Map;
// 获取所有要素图层
List<FeatureLayer> featureLayers = map.GetLayersAsFlattenedList().OfType<FeatureLayer>().ToList();
// 获取所有独立表
List<StandaloneTable> standaloneTables = map.GetStandaloneTablesAsFlattenedList().ToList();

然后把图层名和图标的路径给新创建的FeatureLayerContent类:

// 定义一个空包
List<FeatureLayerContent> flc = new List<FeatureLayerContent>();

// 图层和表的图标
string imagePath = "/CCTool;component/Data/Icons/layer.png";
string imagePath2 = "/CCTool;component/Data/Icons/table.png";

// 把图层和表加到combox中
foreach (string featureLayer in featureLayers)
{
    flc.Add(new FeatureLayerContent() { Path = imagePath, Name = featureLayer });
}
foreach (var standaloneTable in standaloneTables)
{
    flc.Add(new FeatureLayerContent() { Path = imagePath2, Name = standaloneTable });
}

最后一步绑定给ComboBox:

// 应用
comboBox.ItemsSource = flc;

大功告成。

相关推荐

  1. Wpf DataGrid ComboBox

    2024-03-11 09:26:03       36 阅读
  2. WPF学习笔记:StackPanel阴影

    2024-03-11 09:26:03       26 阅读
  3. 【ArcGIS Pro开发】(81):文本符号_CIMTextSymbol

    2024-03-11 09:26:03       45 阅读
  4. 【ArcGIS Pro开发】(80):标注_CIMLabelClass

    2024-03-11 09:26:03       42 阅读
  5. WPS开发系列:WPS SDK初始化

    2024-03-11 09:26:03       39 阅读
  6. WPS开发系列:WPS SDK初始化

    2024-03-11 09:26:03       43 阅读
  7. WPS开发专题:WPS SDK事件回调

    2024-03-11 09:26:03       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 09:26:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 09:26:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 09:26:03       82 阅读
  4. Python语言-面向对象

    2024-03-11 09:26:03       91 阅读

热门阅读

  1. K8S集群

    2024-03-11 09:26:03       44 阅读
  2. Spring Bean 生成流程详细解析

    2024-03-11 09:26:03       47 阅读
  3. 微信小程序修改placeholder样式

    2024-03-11 09:26:03       41 阅读
  4. Node.js_会话控制

    2024-03-11 09:26:03       41 阅读
  5. 《BERT基础教程:Transformer大模型实战》读书笔记

    2024-03-11 09:26:03       37 阅读
  6. 流量分析-webshell管理工具

    2024-03-11 09:26:03       44 阅读
  7. go gin中间件关于 c.next()、c.abort()和return的使用

    2024-03-11 09:26:03       49 阅读
  8. Docker基础—CentOS中Docker安装部署

    2024-03-11 09:26:03       47 阅读
  9. neo4j

    2024-03-11 09:26:03       45 阅读