如何使 WPF 组合框具有 XAML 中最宽元素的宽度?

2024-02-12

我知道如何在代码中执行此操作,但是可以在 XAML 中执行此操作吗?

窗口1.xaml:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <ComboBox Name="ComboBox1" HorizontalAlignment="Left" VerticalAlignment="Top">
            <ComboBoxItem>ComboBoxItem1</ComboBoxItem>
            <ComboBoxItem>ComboBoxItem2</ComboBoxItem>
        </ComboBox>
    </Grid>
</Window>

Window1.xaml.cs:

using System.Windows;
using System.Windows.Controls;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            double width = 0;
            foreach (ComboBoxItem item in ComboBox1.Items)
            {
                item.Measure(new Size(
                    double.PositiveInfinity, double.PositiveInfinity));
                if (item.DesiredSize.Width > width)
                    width = item.DesiredSize.Width;
            }
            ComboBox1.Measure(new Size(
                double.PositiveInfinity, double.PositiveInfinity));
            ComboBox1.Width = ComboBox1.DesiredSize.Width + width;
        }
    }
}

您无法直接在 Xaml 中执行此操作,但可以使用此附加行为。 (宽度将在设计器中可见)

<ComboBox behaviors:ComboBoxWidthFromItemsBehavior.ComboBoxWidthFromItems="True">
    <ComboBoxItem Content="Short"/>
    <ComboBoxItem Content="Medium Long"/>
    <ComboBoxItem Content="Min"/>
</ComboBox>

附加行为 ComboBoxWidthFromItemsProperty

public static class ComboBoxWidthFromItemsBehavior
{
    public static readonly DependencyProperty ComboBoxWidthFromItemsProperty =
        DependencyProperty.RegisterAttached
        (
            "ComboBoxWidthFromItems",
            typeof(bool),
            typeof(ComboBoxWidthFromItemsBehavior),
            new UIPropertyMetadata(false, OnComboBoxWidthFromItemsPropertyChanged)
        );
    public static bool GetComboBoxWidthFromItems(DependencyObject obj)
    {
        return (bool)obj.GetValue(ComboBoxWidthFromItemsProperty);
    }
    public static void SetComboBoxWidthFromItems(DependencyObject obj, bool value)
    {
        obj.SetValue(ComboBoxWidthFromItemsProperty, value);
    }
    private static void OnComboBoxWidthFromItemsPropertyChanged(DependencyObject dpo,
                                                                DependencyPropertyChangedEventArgs e)
    {
        ComboBox comboBox = dpo as ComboBox;
        if (comboBox != null)
        {
            if ((bool)e.NewValue == true)
            {
                comboBox.Loaded += OnComboBoxLoaded;
            }
            else
            {
                comboBox.Loaded -= OnComboBoxLoaded;
            }
        }
    }
    private static void OnComboBoxLoaded(object sender, RoutedEventArgs e)
    {
        ComboBox comboBox = sender as ComboBox;
        Action action = () => { comboBox.SetWidthFromItems(); };
        comboBox.Dispatcher.BeginInvoke(action, DispatcherPriority.ContextIdle);
    }
}

它的作用是调用名为 SetWidthFromItems 的 ComboBox 扩展方法,该方法(不可见地)自行展开和折叠,然后根据生成的 ComboBoxItems 计算宽度。 (IExpandCollapseProvider 需要引用 UIAutomationProvider.dll)

然后扩展方法SetWidthFromItems

public static class ComboBoxExtensionMethods
{
    public static void SetWidthFromItems(this ComboBox comboBox)
    {
        double comboBoxWidth = 19;// comboBox.DesiredSize.Width;

        // Create the peer and provider to expand the comboBox in code behind. 
        ComboBoxAutomationPeer peer = new ComboBoxAutomationPeer(comboBox);
        IExpandCollapseProvider provider = (IExpandCollapseProvider)peer.GetPattern(PatternInterface.ExpandCollapse);
        EventHandler eventHandler = null;
        eventHandler = new EventHandler(delegate
        {
            if (comboBox.IsDropDownOpen &&
                comboBox.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
            {
                double width = 0;
                foreach (var item in comboBox.Items)
                {
                    ComboBoxItem comboBoxItem = comboBox.ItemContainerGenerator.ContainerFromItem(item) as ComboBoxItem;
                    comboBoxItem.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
                    if (comboBoxItem.DesiredSize.Width > width)
                    {
                        width = comboBoxItem.DesiredSize.Width;
                    }
                }
                comboBox.Width = comboBoxWidth + width;
                // Remove the event handler. 
                comboBox.ItemContainerGenerator.StatusChanged -= eventHandler;
                comboBox.DropDownOpened -= eventHandler;
                provider.Collapse();
            }
        });
        comboBox.ItemContainerGenerator.StatusChanged += eventHandler;
        comboBox.DropDownOpened += eventHandler;
        // Expand the comboBox to generate all its ComboBoxItem's. 
        provider.Expand();
    }
}

此扩展方法还提供了调用的能力

comboBox.SetWidthFromItems();

在代码后面(例如在 ComboBox.Loaded 事件中)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 WPF 组合框具有 XAML 中最宽元素的宽度? 的相关文章

  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • 从 Uri 转换位图返回 null [重复]

    这个问题在这里已经有答案了 在我的 Android 应用程序中 我使用 Google 驱动器来选择图像和文件 对于文件 我的代码在大多数情况下都运行良好 不幸的是 在某些情况下图像导入不起作用 图像位图返回空值 下面是我用来将内容 URI
  • 我们如何处理 BDD 场景的微小排列?

    我喜欢 BDD 开发方法 但我遇到了一个问题 即该方法能走多远 这条来自 ThoughtWorks 的最新评论Radar http thoughtworks fileburst com assets thoughtworks tech ra
  • 使用 Guice AOP 在 Jersey 中进行方法拦截

    是否可以使用 Guice AOP 拦截 Jersey 资源上的带注释的方法 我已经成功配置了 Guice 与 Jersey 的依赖注入集成 没有任何问题 但是我配置的拦截器根本没有拦截我带注释的方法 web xml
  • 在 Bootstrap 3 的弹出窗口中放置一个表单? [复制]

    这个问题在这里已经有答案了 如何在 Bootstrap 3 中的弹出窗口中放置表单 a href class btn btn lg btn danger title Click It a 它给出了如下效果 我想在它的体内放置一个形式 我们怎
  • Rails 与非 Rails 数据库设计

    完全新手研究 Rails Rails 是否可以与不符合 Rails 默认命名和设计约定的只读模式一起使用 例如 我的数据库架构具有使用字符串列作为唯一主键的基表 例如 名为 Jobs 的基表可能具有定义为 Jobs Job 的唯一主键 并且
  • IntelliJ Idea - 在调试器中搜索值

    我需要知道是否可以在 IntelliJ Idea 的调试器中搜索值 示例 您有一个巨大的对象树 您需要找到设置为相同特定值的字符串变量 有什么办法可以做到这一点吗 展开此树以便您可以看到所有这些字符串 然后开始输入您要搜索的内容 快速搜索应
  • 在嵌套片段中使用 OptionsMenu

    我使用在我的主机活动中实现的 NavigationDrawer 模式菜单活动 我的导航有 3 个项目 项目 1 项目 2 项目 3 每个项目都绑定到一个片段 当我单击 Item 1 时 我显示了一个片段 A 它实现了具有多个片段 嵌套片段
  • 访问抽象类 (Scala) 中构造函数创建的字段

    我有一个实现一种方法的抽象类 我如何访问参数internalValue 由抽象类构造函数设置 abstract class Value internalValue Int def equal v Value Boolean def notE
  • 如何查询以二进制形式存储在数据库中的 UUID(JPA/Hibernate/MySQL)

    我有一个基于 Java JPA Hibernate MySQL 的应用程序 我想使用 UUID 进行对象标识 但我想确保数据库性能不会受到影响 我发现了这篇很棒的博客文章JPA 和 UUID 主键 http www thebinaryidi
  • 如何在ag-grid中动态设置行高和列宽

    我已经使用它来尝试适应列和行的宽度 如何在ag grid中动态设置行高和列宽 请在typescript中提供git hub代码 我假设您想根据行的内容设置行高 步骤 1 将 getRowHeight 属性设置为 JavaScript 函数
  • 在编译时强制存在无参构造函数 (Java)

    我有一堂课有点像这样 public class Test private final List
  • 即使在应用程序中设置核心,Spark UI 也显示 0 核心

    我在运行 Spark Master url 之外的应用程序时遇到了一个奇怪的问题 其中 UI 无限期地报告 等待 的 状态 因为无论我将核心计数配置为什么 正在运行的应用程序 表下都会显示 0 个核心是 我已经使用以下设置配置了我的应用程序
  • 获取 macOS 上当前用户的桌面路径

    I use NSArray paths NSSearchPathForDirectoriesInDomains NSDesktopDirectory NSUserDomainMask YES NSString theDesktopPath
  • Maven Jetty 垃圾邮件警告“从多个位置扫描”

    我发现了类似的问题here https stackoverflow com questions 50190689 maven scanned from multiple locations type of warnings 但它指向一个我没
  • 如何暂时禁用 Coq 中的符号

    当您熟悉项目时 符号很方便 但当您刚刚开始使用代码库时 符号可能会令人困惑 我知道你可以用白话关闭所有符号Set Printing All 但是 我想保留一些打印 例如隐式参数 全部打印如下 Require Import Utf8 core
  • 热切加载:在具有雄辩关系的枢轴上使用“with”

    有4张表 bundles 身份证号 姓名 products 身份证号 姓名 prices 身份证号 姓名 bundle product id bundle id product id price id 有3种型号 Bundle Produc
  • 核心数据结构是否使用多个实体?

    我有一个核心数据模型 我正在尝试弄清楚如何构建它 可以说我有一个Recipe 它有一个name title image和 5 种成分 我可以制作一个食谱实体吗recipeName title 然后一个Image实体与recipeName i
  • Rails first_or_create ActiveRecord 方法

    什么是first or create first or create Rails 中的方法 根据文档 http apidock com rails ActiveRecord Relation first or create 方法 没有描述
  • 存储字典值的路径

    如何将值的路径存储在dict of dict是 例如 我们可以轻松地将路径存储到name变量中的值name field person person name Jeff Atwood person address person address
  • 如何使 WPF 组合框具有 XAML 中最宽元素的宽度?

    我知道如何在代码中执行此操作 但是可以在 XAML 中执行此操作吗 窗口1 xaml