【问题标题】:WPF - How to restyle ComboBox to remove the textbox/editbox and replace with static textWPF - 如何重新设置组合框的样式以删除文本框/编辑框并替换为静态文本
【发布时间】:2013-05-22 10:59:31
【问题描述】:

我想重新设置格式化为下拉列表类型的 WPF ComboBox 的样式,但是删除填充了所选内容的所选 TextBox 并将其替换为一些静态文本和保持不变的图像,模拟按钮的样子。

所以实际上它变成了一个按钮下拉列表,所以当我从下拉列表中选择一个项目时,我可以通过命令绑定填充另一个控件,并使用其选定的值并且按钮样式保持不变。

基本上就像我一起破解的这张粗略的图片。

我看过带有上下文菜单的按钮示例,但我不喜欢这个想法,而 ComboBox 在功能以及简单的命令和数据绑定方面完全符合我的需求。

我知道这是可以做到的,但是在阅读了基于其他控件的过于混乱的示例后,我对自己的能力失去了信心。我找不到详细说明我需要学习的示例。

干杯 迪吉迪

【问题讨论】:

    标签: wpf combobox wpf-controls


    【解决方案1】:

    在玩了很多之后,我决定更好的选择是使用带有绑定上下文菜单的按钮,这最终成为更好的解决方案。

    感谢您的帮助,马克。

    【讨论】:

    • 不丑吗?您是否尝试过在 ComboBox 上方使用只读的 EditBox?结果看起来与您的示例完全相同。太糟糕了,与您的期望不符。我很高兴你的上下文菜单边界能做到!
    • 我发现该组合不适合我想要的整体外观,但无论如何感谢您的帮助,因为我很可能会在其他地方使用我在这里学到的东西。
    【解决方案2】:

    我也遇到了同样的问题,其实很简单。 只需放置一个带有 SelectionChanged 事件的只读 ComboBox。 您将静态文本放入索引 0。

    现在,当用户选择某物时,获取所选项目,然后将 SelectedIndex 设置为 0。这样您就获得了用户选择的项目,但显示的文本是相同的。

    见:

    private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ComboBox combo = (ComboBox)sender;
        if (combo.SelectedIndex > 0)
        {
            // Do your stuff here...
    
            // Then
            combo.SelectedIndex = 0;
        }
    }
    

    【讨论】:

    • 感谢您的快速回复。快到了,但这意味着索引 0 也包含在下拉列表中,有没有办法在不添加到列表中的情况下做到这一点?
    • 是的,它包含在内,但如果您选择它,则不会发生任何事情。作为取消选项。目前我没有看到任何其他答案,但我仍在考虑。
    • 我想我可以用一个 xmal 数据触发器来改变它的可见性,我正在玩一个相当有限的 wpf/xaml 知识,看看我是否也能做到这一点,然后我会有一个可行的解决方案
    • 看我的另一个答案,我想它会符合你的期望。
    【解决方案3】:

    [编辑] 据我所知,我更喜欢我以前的答案。因此,请确保您,读者,我之前的回答与您的期望不符。 [/EDIT]

    另一个答案是将您的对象放在 ComboBox 上方,然后从该对象捕获 MouseDown 事件并放下 ComboBox。我在示例中使用了只读文本框。

    见:

    <Grid>
        <ComboBox x:Name="Combo" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="120">
            <ComboBoxItem Content="TEST" />
            <ComboBoxItem Content="TEST1" />
            <ComboBoxItem Content="TEST2" />
            <ComboBoxItem Content="TEST3" />
        </ComboBox>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" Text="TextBox" VerticalAlignment="Top" Width="120" IsReadOnly="True" PreviewMouseDown="TextBox_PreviewMouseDown"/>
    </Grid>
    

    然后是后面的代码:

    private void TextBox_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        e.Handled = true; // Prevents the event.
        Combo.IsDropDownOpen = true; // Drops down the ComboBox.
    }
    

    对我来说很好用。

    【讨论】:

    • 我是使用 Microsoft Visual Studio Designer 完成的,因此请确保两个组件完全位于同一位置。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2018-11-25
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2015-07-21
    相关资源
    最近更新 更多